ado.net大全对象体系:connection->data adapter->dataset->winform可逆
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:
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编程实现DataSet1.使用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可以确定有效的记录数和字段数,最后利用记录索引值和列索引值可以唯一确定数据表中的任何数据。 |
|
来自: 悟静 > 《.net和asp.net》