ado.net大全

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:

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中的各个表进行错误检查,方法一样,也是根据各个DataTableHasErrors属性。如果表中有错误发生,那么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.增加一个DataTableDataSet中。

              具体操作是,首先在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中提供了两种数据约束,ForeignKeyConstraintUniqueConstraint

 

    ForeignKeyConstraint,外键值一致性约束,定义当表中的一条记录被删除或者是增加一条记录时,与该表相关的其他表的相应记录如何处理。例如,当一个客户被人从客户信息表中删去,那么在购物信息表中的关于他的购物信息的记录如何处理等等。

    ForeignKeyConstraint有五个可能的值如下:

    ·Cascade     当表中记录被删除或者更新以后,对应表中的记录相应被删除和更新

    ·SetNull       当表中记录被删除或者更新以后,对应表中的记录被置为Null

    ·SetDefault 当表中记录被删除或者更新以后,对应表中的记录被置为缺省值

    ·None        当表中记录被删除或者更新以后,对应表中的记录不做任何处理

    ·Default       当表中记录被删除或者更新以后,ForeignKeyConstraint采用其缺省值,通常该值为Cascade

    具体使用ForeigKeyConstraint时,首先应创建它,然后设置DeleteRuleUpDateRule属性,指明当删除和更新记录时,对应表的处理规则。

   

    例子:我们对客户信息表定义一个外键定义,它定义当客户信息表中记录删除时,其关联表购物信息表中的数据也应删除(意味着用户不存在,自然也不应该有他的购物信息),当客户信息表中记录被修改时,购物信息置为缺省的特殊值(意味着,当销售人员发生差错,记错购物用户,那么以他的名义购物的定单不应算在该用户头上,置为特殊标记,以供今后修改),代码演示如下:

 

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对象,它类似于数据库概念中的记录,然后对DataRowColumns集合进行赋值,最后把DataRow对象加入到DataTableDataRows集合中,就相当于在表中插入一条记录。

      

       例如:如下一个表MyTable中有两个列SqnoNameSqno为序号,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         删除表中记录

       DataTableRows集合提供了两种方法从一个数据表中删除一条记录,它们是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,它都可能有三种状态:OriginalCurrentPreposedOriginal状态是指当数据第一次被加入到数据表中时候的状态。Current态指经过多次改变Original数据后得到的RowPreposed态存在于一个相当短暂的时期,它是由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集合使用DataTableSelect方法可以找出有效的Rows集合,然后根据Rows.countcolumns.count可以确定有效的记录数和字段数,最后利用记录索引值和列索引值可以唯一确定数据表中的任何数据。

      

posted on 2005-04-23 16:35  奇远  阅读(1002)  评论(0编辑  收藏  举报

导航