ado.net大全
ado.net大全
connection->command->webform 可逆
|
->datareader->other
dataset->datatable->datacolumn->datarow
connection:实现与数据源连接
dataset:ado.net核心地位,它实现与数据源无关性。
command:包含实际数据库信息,如查询、修改、调用存储过程。
dataadapter:是数据源与dataset的桥。它用command将结果传给dataset,并将dataset
中的数据改动回馈给数据源。
datareader:简单、不要求回传更新数据的查询。
dim connection con=new connection
dim datasetcommand cmd=new datasetcommand(sqltxt,con)
dim dataset ds =new dataset()
cmd.filldataset(ds,"students")
dataadapter.selectcommand;insertcommand;deletecommand;updatacommand;
tablemappings?
必须显示的关闭连接。
'返回不同类型值
cmd.executereader;;;;;;;;;;;cmd.executenonquery;;;;;;;;;;;;;;;cmd.executescalar
‘存储过程
sqlcmd=sqlconn.createcommand()
sqlcmd.commandtext="queryauthor"
sqlcmd.commandtype=commandtype.storedprocedure
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sqlcmd.parameters.add("@author",sqldbtype.naarchar).value="qiyuan"
向存储过程传递参数。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
指令
dim datareader sqldr =cmd.executereader()
ngets=sqldr.getvalues(cols)
while sqldr.read()
for i=0 to ngets-1
sqldr[i].tostring()
next i
connection conn=new connection()
dataadapter adapte=new dataadapter()
adapter.selectcommand=new oledbcommand(sqltxt,conn)
.insercommand
.updatecommand
.deletecommand
dapter.fill(dataset)
return dataset
adapter.updata
ado.net and sql:
ADO.NET Managed Provider |
ADO.NET SQL Managed Provider |
|
需要引入的Namespace |
System.Data.ADO |
System.Data.SQL |
Connection对象 |
ADOConnection |
SQLConnection |
Command对象 |
ADODatasetCommand |
SQLDatasetCommand |
Dataset对象 |
Dataset |
Dataset |
DataReader |
ADODataReader |
SQLDataReader |
连接数据库例子 |
String sConnectionString = "Provider= SQLOLEDB.1; Data Source=localhost; uid=sa; pwd=; Initial Catalog=pubs";
ADOConnection con = new ADOConnection(sConnectionString); con.Open(); |
String sConnectionString = "server=localhost;uid=sa;pwd=;database=pubs"; SQLConnection con = new SQLConnection(sConnectionString); con.Open();
|
执行SQL语句例子 |
ADOCommand cmd = new ADOCommand("SELECT * FROM Authors", con); ADODataReader dr = new ADODataReader(); cmd.Execute(out dr); |
SQLCommand cmd = new SQLCommand(("SELECT * FROM Authors", con); SQLDataReader dr = new SQLDataReader(); cmd.Execute(out dr); |
使用存储过程例子 |
ADOCommand cmd = new ADOCommand ("spGetAuthorByID", con); cmd.CommandType = CommandType.StoredProcedure;
ADOParameter prmID = new ADOParameter("AuthID", ADODataType.VarChar, 11);
prmID.Value = "111-11-1111";
cmd.SelectCommand.Parameters.Add(prmID);
ADODataReader dr; cmd.Execute (out dr); |
SQLCommand cmd = new SQLCommand("spGetAuthorByID", con); cmd.CommandType = CommandType.StoredProcedure;
SQLParameter prmID = new SQLParameter("@AuthID", SQLDataType.VarChar,11);
prmID.Value = "111-11-1111" cmd.SelectCommand.Parameters.Add(prmID); SQLDataReader dr; cmd.Execute(out dr); |
3.3.1从数据库得到DataSets的使用
使用一个从数据库获得的DataSets较为复杂,它的步骤大概如下:
1. 使用SQLDataSetCommand命令(SQL方式)或者ADODataSetCommand命令(ADO方式)从数据库管理系统中获取一个表结构及其数据填充到本地内存的DataSet的一个表中。
例如:
·Ado方式
Dim MyDsComm As New ADODataSetCommand
Dim MyComm As ADOCommand
Dim MyConn As ADOConnection
MyConn = New ADOConnection _
("Provider=SQLOLEDB.1;Initial Catalog=Northwind;" & _
"Data Source=(local);User ID=sa;")
MyComm = New ADOCommand("SELECT * FROM Customers", MyConn)
MyDsComm.SelectCommand = MyComm
·SQL方式
Dim MyConn as SQLConnection
Dim MyComm as SQLDataSetCommand
Dim MyDs as New DataSet
MyConn=New SQLConnection(“server=localhost;uid=sa;pwd=;database=pubs”)
MyComm=New SQLDataSetCommand(“Select * from authoers”,MyConn)
MyComm.FillDataSet(Myds,”authers”)
2.对DataSet中的表对象DataTable的数据进行操作,包括增加、删除、修改它的DataRow对象
3.使用GetChanges方法产生一个DataSet修改后的对象的DataSet集合。
代码如下:
Dim changedDataSet As DataSet
changedDataSet = ds.GetChanges(DataRowState.Modified)
4.通过对产生的DataSet对象的HasErrors属性的监控,查看是否DataSet中的表有错误发生。
5.如果有错误发生,就要对DataSet中的各个表进行错误检查,方法一样,也是根据各个DataTable的HasErrors属性。如果表中有错误发生,那么GetErrors方法就会被激活,并且会返回一个含有错误的DataRow对象的数组。
6.当表出错时,对于每一个DataRow对象的RowError属性进行检测。
7.如果可能,处理发生的错误。
8.使用DataSet对象的Merge方法把检测无错误发生的修改后的DataSet合并入原先的DataSet中,代码如下:
ds.Merge(changedDataSet)
9.使用DataSetCommand对象的update方法,把合并后的DataSet对象送往数据库端进行修改,代码如下:
MyDataSetCommand.Update(ds)
10.使用DataSet对象的AcceptChanges方法对数据库修改进行确认,或者使用RejectChanges方法撤消对数据库的修改,代码如下:
Ds.AcceptChanges
3.3.3.2编程实现DataSet
1.使用DataSet()创建器创立一个DataSet对象。
DataSet()可以跟一个字符串用以指明创建的DataSet名字
Dim ds1 as New DataSet
Dim ds2 as New DataSet(“MyDataSet”)
2.增加一个DataTable到DataSet中。
具体操作是,首先在DataSet对象的Tables集合中,增加一个表
ds.Tables.Add(New DataTable(表名))
然后,再在该表中的Columns集合中增加相应的列
ds.Tables(表名).Columns.Add(列名,列类型)
例如:我们在ds对象中建立一个订购表(Order),它有三个字段,客户名(CUNM)、订货编号(ORNO)、订货数量(ORNM)
ds.Tables.Add(New DataTable(“Order”))
ds.Tables(“Order”).Columns.Add(“CUNM”,GetType(String))
ds.Tables(“Order”).Columns.Add(“ORNO”,GetType(String))
ds.Tables(“Order”).Columns.Add(“ORNM”,GetType(int32))
ds.Tables(“Order”).PrimaryKey=
New DataColumn(ds.Tables(“Order”).Columns(“ORNO”)
在上面的例子中,我们还设置了订购表的键值,这是通过对它的PrimaryKey的属性设置来得到的,设置键值的好处在于可以防止相同记录的输入,保证数据的唯一性。
3.设置表间的关系
由于DataSet对象中可以含有多个DataTable,而事实上每一个表又不可能与其他的表没有任何的关系,这样就带来了一个问题,我们如何描述两个不同的表之间的关系?asp.net提供了DataRelation对象来描述表和表之间的关系。DataRelation对象至少需要两个参数才能确定两个表之间的关系,这是因为在两个表的关系中,至少需要一个主键列和一个外键列,才能确定两者之间的对应关系。
例如:关于客户购物有两个表,一个是客户信息表(Customer),一个是购物信息表(Order),很显然它们两者之间存在着某种联系。经过分析,我们发现客户编号(CUNO)在两个表中都存在,它使我们能够把两个表的信息连接起来,告诉我们这样一个事实,谁订购了什么物品。因此需要建立关于客户信息表和购物信息表的一个联系,用Asp.net语言表达如下:
Dim ds as DataSet
…
ds.Relations.Add(“CustomerOrder”,ds.Tables(“Customer”).Columns(“CUNO”),
ds.Tables(“Order”).Columns(“CUNO”))
4.在关系表间的浏览
通过DataRelaiton的设置,我们可以在同一个DataSet中,由对一个表操作,找到可能引起的相关表的变化。例如,对于客户信息表中的对应于某个人的一条记录,我们可以在购货信息表中找到所有属于他的购货信息,演示代码如下:
dim orderRows() as DataRow
orderRows=ds.Tables(“Customer”).ChildRelations(“CustomerOrder”).GetChildRows(
ds.Tables(“Customer”).Rows(0))
5.数据约束的使用
在关系数据库中,使用数据约束的目的是为了使数据库的一致性得到保证。当数据发生改变时,数据约束被执行,用以检查对数据的修改,是否和已经定义的规则相符合,如果不符合修改将不能生效。在asp.net中提供了两种数据约束,ForeignKeyConstraint和UniqueConstraint。
ForeignKeyConstraint,外键值一致性约束,定义当表中的一条记录被删除或者是增加一条记录时,与该表相关的其他表的相应记录如何处理。例如,当一个客户被人从客户信息表中删去,那么在购物信息表中的关于他的购物信息的记录如何处理等等。
ForeignKeyConstraint有五个可能的值如下:
·Cascade 当表中记录被删除或者更新以后,对应表中的记录相应被删除和更新
·SetNull 当表中记录被删除或者更新以后,对应表中的记录被置为Null
·SetDefault 当表中记录被删除或者更新以后,对应表中的记录被置为缺省值
·None 当表中记录被删除或者更新以后,对应表中的记录不做任何处理
·Default 当表中记录被删除或者更新以后,ForeignKeyConstraint采用其缺省值,通常该值为Cascade
具体使用ForeigKeyConstraint时,首先应创建它,然后设置DeleteRule和UpDateRule属性,指明当删除和更新记录时,对应表的处理规则。
例子:我们对客户信息表定义一个外键定义,它定义当客户信息表中记录删除时,其关联表—购物信息表中的数据也应删除(意味着用户不存在,自然也不应该有他的购物信息),当客户信息表中记录被修改时,购物信息置为缺省的特殊值(意味着,当销售人员发生差错,记错购物用户,那么以他的名义购物的定单不应算在该用户头上,置为特殊标记,以供今后修改),代码演示如下:
dim fk as New ForeignKeyConstraint(ds.Tables(“Customer”).Columns(“CUNO”),
ds.Tables(“Order”.Columns(“CUNO”))
‘创建外键约束为Customer表和Order表中CUNO字段
fk.DeleteRule=Cascade
fk.UpdateRule=SetDefault
‘删除规则为Cascade,修改规则为SetDefault
ds.Tables(“Customer”).Constraints.Add(fk)
‘加入Customer表的一致性约束集合中
UniqueConstraint,唯一性约束,它指定了数据表中的一个列或者几个列的集合的值的唯一性,通常被指定为唯一约束的字段都是表的键值。
例如:对于客户信息表,因为每个人的购物都必须和别人区别,这样才能保证正确地付款和发送货物,因而每一个人的客户编号都不应该相同,这时就可以使用唯一性约束来保证客户信息表中的客户编号唯一。演示代码如下:
dim uc as UniqueConstraint
uc=New UniqueConstraint(ds.Tables(“Customer”).Columns(“CUNO”))
‘指定唯一约束为Customer表中的CUNO字段
ds.Tables(“Customer”).Constraints.Add(uc)
‘把唯一约束加入Customer表的约束中
6.处理DataSet的事件
为了便于用户对DataSet的控制,asp.net提供了DataSet的一系列可被用户处理的事件,它们包括:
·PropertyChange 当属性发生改变时
·MergeFailed DataSet合并失败时
·RemoveTable 删除一个表时
·RemoveRelation 删除一个关系时
·Adding the event handler to the event 增加一个事件处理函数时
例如:
ds.AddOnPropertyChange(new System.ComponentModel.PropertyChangeEventHandler _
(AddressOf me.DataSetPropertyChange))
‘指定当DataSet发生PropertyChange事件时的消息处理函数为DataSetPropertyChange
ds.AddOnMergeFailed(new System.Data.MergeFailedEventHandler _
(AddressOf me.DataSetMergeFailed))
‘指定当DataSet发生MergeFailed事件时的消息处理函数为DataSetMergeFailed
‘当PropertyChange发生时的处理函数
Private Sub DataSetPropertyChange _
(ByVal sender As Object, ByVal e As System.PropertyChangeEventArgs)
…
End Sub
‘当MergeFailed发生时的处理函数
Private Sub DataSetMergeFailed _
(ByVal sender As Object, ByVal e As System.Data.MergeFaileedEventArgs)
…
End Sub
3.3.3.4数据的载入
l 向表中加入数据
当一个表结构已经创建好以后,剩下的问题就是如何把数据载入我们已经建立好的表中。通常采用的方法是,先创建一个DataRow对象,它类似于数据库概念中的记录,然后对DataRow的Columns集合进行赋值,最后把DataRow对象加入到DataTable的DataRows集合中,就相当于在表中插入一条记录。
例如:如下一个表MyTable中有两个列Sqno和Name,Sqno为序号,Name设为”MyName”+序号,我们利用一个循环产生n条记录到MyTable中
Dim i as integer
Dim n as integer
Dim MyRow as DataRow
…
For i = 0 to n
MyRow = MyTable.NewRow()
‘产生一条新记录
MyRow("Sqno") = I
‘对sqno字段赋值
MyRow("Name") = "MyName" & i.ToString()
‘对name字段赋值
MyTable.Rows.Add(MyRow)
‘加入记录到表中
Next
…
l 删除表中记录
DataTable的Rows集合提供了两种方法从一个数据表中删除一条记录,它们是Remove方法和Delete方法。示例如下:
删除MyTable中的第三条记录:
MyTable.Rows.Remove(3)或者
MyTable.Rows(3).Delete
Delete方法和Remove方法的区别不仅仅是方法的使用形式上。当调用Remove方法后,那么指定的DataRow就会从Rows集合中被删除。而Delete方法调用时,指定的DataRow并不真正从Rows集合中删除,只是作了一个删除标记,直到DataSet对象调用AcceptChanges方法的时候,才真正被删除;如果是RejectChanges方法被调用,那么Delete方法删除的DataRow对象将被恢复。
l 使用表中的数据
对于DataTable中的每一个Row,它都可能有三种状态:Original、Current、Preposed。Original状态是指当数据第一次被加入到数据表中时候的状态。Current态指经过多次改变Original数据后得到的Row。Preposed态存在于一个相当短暂的时期,它是由original态过渡到Current态时的中间状态,一个明显的例子是对数据进行修改而尚未完成时,开始是Original态,完成后是Current态,而这之间就是Preposed态。
为了说明对表中数据的使用,我们来看下面一个例子,它是对workTable按每一个字段进行遍历,并把字段名和内容显示出来。
Dim CurrRows() As DataRow = workTable.Select(Nothing, Nothing, _
System.Data.DataViewRowState.CurrentRows)
‘对workTable数据集合选择有效的DataRows放入CurrRows数组
Dim list As String = System.String.Empty
‘清空list字符串
Dim RowNo As Integer
Dim ColNo As Integer
For RowNo = 0 to CurrRows.Count – 1
‘每一条记录的循环
For ColNo = 0 To workTable.Columns.Count – 1
‘一条记录中每一个字段的循环
list = ""
list &= workTable.Columns(colNo).ColumnName & " = " & _
CurrRows(RowNo)(ColNo).ToString
Console.WriteLine(list)
Next
Next
If CurrRows.Count < 1 Then Console.WriteLine("No CurrentRows Found")
从上面的例子我们可以看出,对Rows集合使用DataTable的Select方法可以找出有效的Rows集合,然后根据Rows.count和columns.count可以确定有效的记录数和字段数,最后利用记录索引值和列索引值可以唯一确定数据表中的任何数据。