第六章.访问数据库
一.ADO.NET的结构
二.ADO.NET的使用
.NET Framwork提供的常用代码命名空间
命名空间名称
|
说明
|
System.Data
|
ADO.NET基本对象和类型
|
System.Data.SQLClient
|
为SQL Server提供的管理对象
|
System.Data.OleDB
|
为OLEDB Provider提供的管理对象
|
三.连接数据库 Connection
1.连接参数:
(1).语法:
Dim MySqlConnection As New SqlConnection([ConnectionString])
Dim MyOleDbConnection As New OleDbConnection([ConnectionString])
(2).OLE DB接连
Provider:设置数据源的OLE DB驱动程序。Access为”Microsoft.Jet.OLEDB.4.0”,SQL Server6.5或之前版本为”SQLOLEDB”,Oracle为”MSDAORA”
Data Source:设置数据源的实际路径
Password:设置登陆数据库时所用的密码
User ID:设置登陆数据库时所用的账号
(3).SQL连接
Data Source:连接的数据库服务器名
Initial Catalog:连接的数据库名称
Integrated Security:服务器的安全性设置,值有True,False和SSPI三种,True和SSPI都表示使用信任连接
Worksation Id:数据库客户端标识,默认为客户端计算机名
Packet Size:与SQL Server通信的网络数据包的大小,单位为字节,有效值为512-32767,默认值为8192
Password(Pwd):设置登陆SQL Server时所用的密码
User ID:设置登陆SQL Server时所用的账号
Connection Timeout:SqlConnection 对象连接SQL数据库服务器的超时时间,单位为秒。若在设置的时间内无法连接数据库,则返回失败,默认为15秒
(4).注意
如果要使用DSN,则可通过OleDbConnection类来打开数据库连接:
StuConnectio=New OleDbConnection(“DSN=StuDSN”)
2.Connection对象的常用属性
属性
|
说明
|
ConnectionString
|
连接字符串
|
ConnectionTimeout
|
Connection对象的超时时间,单位为秒。即若在这个时间之内Connection对象无法连接数据源,则返回失败。为0表示不限制
|
Database
|
当前数据库名称,默认为Nothing
|
DataSource
|
数据源的完整路径及文件名,若是SQL Serve数据库则获取所连接的SQL Server服务器名称
|
PacketSize
|
与SQL Server通信的网络数据包的大小,单位为字节,默认为8192。此属性只有SQL Server数据库才可使用
|
Provider
|
OLE DB提供程序的名称。此属性只有OLE DB数据源才可使用
|
Server Version
|
数据库驱动程序的版本
|
State
|
数据库的连接状态,1表示联机,0表示关闭
|
WorkstationId
|
数据库客户端标识,默认为客户端计算机名。此属只适用于SQL Server数据库
|
3.Connection对象的常用方法
方法
|
说明
|
Open()
|
打开与数据库的连接。注意,ConnectionString属性只对连接属性进行设置,并不打开与数据库的连接,必须使用Open()方法打开连接
|
Close()
|
关闭数据库连接
|
ChangeDatabase()
|
在打开连接的状态下,更改当前数据库
|
CreateCommand()
|
创建并返回与Connection对象有关的Command对象
|
Dispose()
|
调用Close()方法关闭与数据库的连接,并释放所占用的系统资源
|
4.Connection对象的事件
InfoMessage:在.NET数据提供程序发送警告或信息时触发该事件
StateChange:当数据连接状态改变时,即调用Open()或Close()方法,触发该事件。
该事件的参数为StateChangeEventArgs,有二种取值:
(1)CurrentState:Connection对象连接的新状态,1表示联机,0表示关闭;
(2)OriginState:Connection对象连接的原始状态,1表示联机,0表示关闭
5.例 创建Connection链接对象
(1).打开与Access数据库的连接
<%@Import namespace="System.Data"%>
<%@Import namespace="System.Data.OleDb"%>
<script language="vb" runat="server">
sub Page_Load(Sender as Object,e As EventArgs)
dim conn as new oledbconnection()
conn.connectionstring="provider=microsoft.jet.oledb.4.0;data source="+server.mappath("cbw.mdb")
conn.open()
conn.close() ‘关闭连接
end sub
</script>
(2).打开与SQL Server 2000数据库的连接
<%@Import namespace="System.Data"%>
<%@Import namespace="System.Data.SqlClient"%>
<script language="vb" runat="server">
sub Page_Load(Sender as Object,e As EventArgs)
Dim myConnection As SqlConnection
myConnection=New SqlConnection("server=7BB2389B11EA496;uid=sa;database=cbw")
myConnection.Open()
conn.close() ‘关闭连接
end sub
</script>
(3).针对不同的编程接口建立数据库连接
<%@Import namespace=”System.Data”%>
<%@Import namespace=”System.Data.SQLclient”%>
<%@Import namespace=”System.Data.OleDb”%>
<html>
<script language=”vb” runat=server>
Sub Page_Load(Source as Object,E as EventArgs)
Dim oleconnection as oledbConnection ‘********
Dim oleconnstr as String ‘********
Dim sqlconnection as sqlConnection
Dim sqlconnstr as String
Oleconnstr=”provider=SQLOLEDB;datasource=数据源名称;database=数据库名称;user id=用户名(sa)” ‘********
Oleconnection=new oledbConnection(oleconnstr) ‘********
‘********四行可以改写为:Dim oleconnection as new oledbconnection(“provider=SQLOLEDB;datasource=数据源名称;database=数据库名称;user id=用户名(sa)”)
Sqlconnstr=”server=SQL服务器名称;uid=用户名(sa);pwd=密码(空);database=数据库名称”
Sqlconnection=new sqlConnection(sqlconnstr)
Labcontent.Text=”成功建立连接”
Oleconnection=nothing
Sqlconnection=nothing
End Sub
</script>
<body>
<form runat=server>
<asp:label id=labcontent runat=server/><br>
</form>
</body>
</html>
四.访问数据库
1.基于Command对象,用DataReader对象访问数据库
I.Command对象
1).语法:
Dim MySqlCommand As New SqlCommand([cmdText,connection])
Dim MyOleDbCommand As New OleDbCommand([cmdText,connection])
2). Command对象的常用属性
属性
|
说明
|
CommandText
|
要对数据源执行的SQL命令、存储过程或数据表名
|
CommandTimeout
|
Command对象的超时时间,单位为秒。默认为30秒,即若在这个时间之内Command对象无法执行SQL命令,则返回失败,为0表示不限制
|
CommandType
|
命令类型,可取的值:StoredProcedure,TableDirect,Text,代表的含义分别为:存储过程、数据表名和SQL语句,默认为Text。属性的值可表示为CommandType.StoredProcedure、CommandType. TableDirect、CommandType.Text等,也可以用相应的数字表示
|
Connection
|
Command对象所使用的数据连接属性
|
Parameters
|
SQL命令参数集合
|
3). Command对象的常用方法
方法
|
说明
|
Cancel()
|
取消Command对象的执行
|
CreateParameter
|
创建Parameter对象
|
ExecuteNonQuery()
|
执行CommandText属性指定的内容,返回数据表被影响的行数。只有Update、Insert和Delete命令会影响行数。该方法用于执行对数据库的更新操作。
一般用于不需要返回值的操作。如Update、Insert、Delete操作。
|
ExecuteReader()
|
执行CommandText属性指定的内容,返回DataReader对象
一般用于需要返回值的操作。如Select操作。
|
ExecuteScalar()
|
执行CommandText属性指定的内容,返回结果表第一行第一列的值。该方法只能执行Select命令
|
ExecuteXmlReader()
|
执行CommandText属性指定的内容,返回XmlReader对象。只有SQL Server才能用此方法
|
4).例
例1.
Dim cmd As New OleDbCommand()
cmd.CommandText=”students”
cmd.CommandType=Command.TableDirect
cmd.Connection=conn
例2.
……
Dim sqlstr as string=”Update students set age=age+10 where id=2”
Dim cmd As New OleDbCommand(sqlstr,conn) ‘创建Command对象
cmd.ExecuteNonQuery() ‘执行CommandText命令
conn.Close()
……
例3:使用不同的接口删除记录
<%@Import namespace=”System.Data”%>
<%@Import namespace=”System.Data.SQLclient”%>
<%@Import namespace=”System.Data.OleDb”%>
<html>
<script language=”vb” runat=server>
Sub Page_Load(Source as Object,E as EventArgs)
Dim oleconnection as New oledbConnection(“provider=SQLOLEDB;datasource=数据源名称;database=数据库名称;user id=用户名(sa)”)
Dim olecommand as New oledbCommand
Dim sqlconnection as New sqlConnection(“server= SQL服务器名称;uid=用户名(sa);pwd=密码(空);database=数据库名称”)
Dim sqlcommand as new sqlcommand
Oleconnection.Open
Olecommand.Connection=oleconnection
Olecommand.CommandText=”delete from 表名 where 条件”
Olecommand.ExecuteNonQuery
Olecommand=nothing
Oleconnection.Close
Oleconnection=nothing
Sqlconnection.Open
Sqlcommand.Connection=sqlconnection
Sqlcommand.CommandText=” delete from 表名 where 条件”
Sqlcommand.ExecuteNonQuery
Sqlcommand=nothing
Sqlconnection.Close
Sqlconnection=nothing
Labcontent.Text=”删除成功”
End Sub
</script>
<body>
<form runat=server>
<asp:label id=labcontext runat=server/><br>
</form>
</body>
</html>
II.DataReader对象
说明:该对象只能读取数据,不能写入数据,并且只能顺序读取数据,即将数据表中的行从头至尾依次顺序读出。
1).语法:
Dim objReader as OleDbDataReader
2). DataReader对象的常用属性
属性
|
说明
|
FieldCount
|
DataReader对象包含的记录行数(也就是返回的数据字段数)
|
IsClosed
|
DataReader对象的状态,为True表示关闭
|
Item({name,col})
|
表字段值。Name为字段名;col为列序号,序号从0开始。例如:objReader.Item(0),objReader.Item(“name”)
|
RecordsAffected
|
在执行Insert、Update或Delete命令后影响的行数。该属性只有在读取完所有行且DataReader对象关闭后才会被设定
|
3). DataReader对象的常用方法
方法
|
说明
|
Close()
|
关闭DataReader对象
|
GetBoolean(Col)
|
获取序号为Col的列的值,所获取列的数据类型必须为Boolean类型;其他类似的方法还有:GetByte,GetChar,GetDateTime,getDecimal,GetDouble,
GetFloat,GetInt16,GetInt32,GetInt64,GetString等
|
GetDataTypeName(Col)
|
获取序号为Col的列的来源数据类型名
|
GetFieldType(Col)
|
获取序号为Col的列的数据类型
|
GetName(Col)
|
获取序号为Col的列的字段名
|
GetOrdinal(Name)
|
获取字段名为Name的列序号
|
GetValue(Col)
|
获取序号为Col的列的值
|
GetValues(values)
|
获取所有字段的值,并将字段值存放在values数组中
|
IsDBNull(Col)
|
若序号为Col的列为空值,则返回True,否则返回False
|
Read()
|
读取下一条记录,返回布尔值。返回True表示有下一条记录,返回False表示没有下一条
|
III.基于Command对象,用DataReader对象查询数据
<%@Import namespace="System.Data"%>
<%@Import namespace="System.Data.OleDb"%>
<%@ Page Language="vb" Debug="true" %>
<script language="vb" runat="server">
sub Page_Load(Sender as Object,e As EventArgs)
if not ispostback then
dim conn as new oledbconnection()
dim cmd as new oledbcommand()
dim objreader as oledbdatareader
dim i as integer
conn.connectionstring="provider=microsoft.jet.oledb.4.0;data source="+server.mappath("cbw.mdb")
conn.open()
cmd.connection=conn
cmd.commandtext="select * from message"
objreader=cmd.ExecuteReader() ‘执行CommandText命令,并返回给objreader
response.write("留言表")
response.write("<table><tr>")
for i=0 to objreader.FieldCount-1 ‘循环显示所有字段名
response.write("<td>"+objreader.GetName(i)+"</td>") ‘显示字段名
next
while objreader.read() ‘循环显示所有记录
response.write("<tr>")
for i=0 to objreader.fieldcount-1 ‘循环显示当前记录的所有字段信息
response.write("<td>")
response.write(objreader.GetValue(i))
response.write("</td>")
next
response.write("</tr>")
end while
response.write("</table>")
objreader.close()
conn.close()
end if
end sub
</script>
IV.把DataReader绑定到DataGrid对象上 同理可以绑定到Repeater及DataList对象上
<%@Import namespace="System.Data"%>
<%@Import namespace="System.Data.OleDb"%>
<%@ Page Language="vb" Debug="true" %>
<script language="vb" runat="server">
sub Page_Load(Sender as Object,e As EventArgs)
if not ispostback then
dim conn as new oledbconnection()
dim cmd as new oledbcommand()
dim objreader as oledbdatareader
dim i as integer
conn.connectionstring="provider=microsoft.jet.oledb.4.0;data source="+server.mappath("cbw.mdb")
conn.open()
cmd.connection=conn
cmd.commandtext="select * from message"
objreader=cmd.ExecuteReader() ‘执行CommandText命令,并返回给objreader
MyDataGrid.DataSource=objreader
MyDataGrid.DataBind
objreader.close()
conn.close()
end if
end sub
</script>
<form runat=server >
<asp:DataGrid id="MyDataGrid" runat=server/>
</form>
IV. 用DataReader对象查询数据
<%@Import namespace=”System.Data”%>
<%@Import namespace=”System.Data.OleDb”%>
<html>
<script language=”vb” runat=server>
Sub Page_Load(Source as Object,E as EventArgs)
Dim oleconnection as New oledbConnection(“provider=SQLOLEDB; database=数据库名称;user id=用户名(sa)”)
Dim olecommand as New oledbCommand
Dim oledatareader as oledbDatareader
Oleconnection.Open
Olecommand.Connection=oleconnection
Olecommand.CommandText=”select * from student”
Oledatareader=olecommand.ExecuteReader
While oledatareader.Read
Labcontent.Text=labcontent.Text&oledatareader.GetString(“0”)&”<br>” ‘获取字符类型字段
Labcontent.Text=labcontent.Text&oledatareader.GetString(“1”)&”<br>”
Labcontent.Text=labcontent.Text&oledatareader.GetInt32(“2”)&”<br>” ‘获取整数类型字段
Labcontent.Text=labcontent.Text&oledatareader.Item(“address”)&”<br>” ‘使用字段名获取
End While
Olecommand=nothing
Oleconnection.Close
Oleconnection=nothing
Labcontent.Text= Labcontent.Text&”查找成功”
End Sub
</script>
<body>
<form runat=server>
<asp:label id=labcontext runat=server/><br>
</form>
</body>
</html>
注:
①.GetString :获取字符类型字段
②.GetInt32 :获取整数类型字段
③.GetBoolean :获得布尔类型的数据
④.GetDateTime:获得时间类型的数据
⑤.GetFloat :获得浮点类型数据
⑥.GetName :获得字段的名字