我们可以利用DataSetCommand 对象来执行下列的工作: 1. 将数据源的记录取回,并植入DataSet 对象作管理。我们可以利用DataSetCommand 对象的FillDataSet 方法来将取得的数据填入 DataSet 对象中。当我们执行这个方法的时候,它会将SQL Select 的叙述送至数据源。
2. 将DataTable 的内容传回数据源。要将DataSet 中的DataTable 对象所作的变更传回数据源作更新,我们可以使用DataSetCommand 对象的Update 方法。当我们使用这个方法时,它会将所需要的SQL Insert、Update 或是Delete 传回数据源。Update 这个方法会检查每一个DataRow 的状态,若DataRow 是新增加的,该方法就下达Insert 的SQL 命令;若DataRow 有被修改过,该方法就下达Update 的SQL 叙述;若DataRow 被删除,则下达Delete 的SQL 叙述。
DataSetCommand 操作数据源的属性 所以DataSetCommand 中有四个属性,而这四个属性其实都是Command 对象;分别是SelectCommand、InsertCommand、UpdateCommand 以及DeleteCommand 属性。虽然我们可以明确宣告DataSetCommand 中这些对资料源执行更新动作的Command 对象,并设定好该Command 对象的CommandText 属性,并指定适当的SQL 叙述来达到对数据源的Insert、Update 以及Delete 等目的;但是实际上DataSetCommand 对象会自动产生它所需要的SQL陈述,并不需要我们特别指定。
例如我们将数据从数据源取回,放到DataSet 对象中的DataTable 对象,其数据表内容如下表所示:
其中DataRow 对象中有一个用来表示记录内的数据有无改变的RowState 属性,预设都是未改变(Unchanged)。假设程序将jolin 的UserTel 字段内容改掉,其字段状态就会变成已改变(Modified),如下表所示:
当我们使用DataSetCommand 对象的Update 方法,将DataSet 的状态更新回数据源时,DataSetCommand 对象会去检查DataTable 中每一笔记录的RowState。当DataSet 对象检查第一笔和第二笔时,并不会产生任何SQL陈述,因为RowState 属性标示为未改变(Unchanged);当检查到第三笔时,因为RowState 标示为已改变(Modified),Update 方法会自动产生适当的SQL 叙述并且传送到数据源。
使用DataSetCommand 对象 DataSetCommand 对象可以说是DataSet 对象的工作引擎,DataSet 和数据源的互动都是由DataSetCommand对象来执行;而DataSetCommand 则是控制Command对象透过Connection对象对数据源下命令,和数据源进行互动的工作。以下为DataSetCommand 的宣告语法:
Dim 变数As DataSetCommand = New DataSetCommand()
我们先来了解DataSetCommand 对象和其它数据操作对象如何搭配使用:
Dim strConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:InetPubwwwrootCRCH05MyWeb.mdb" Dim strComStr As String = "Select * From Members" Dim cnA As ADOConnection = New ADOConnection(strConStr) '宣告及产生 Connection 对象 Dim cmA As ADOCommand = New ADOCommand(strComStr) '宣告及产生Command 对象 Dim dscA As ADODataSetCommand = New ADODataSetCommand() '产生 DataSetCommand cmA.ActiveConnection = cnA '指定Command 对象cmA 要透过cnA 这个 Connection 对象下命令 dscA.SelectCommand = cmA '指定DataSetCommand 要从数据源取回数据 要透过cmA 这个 'Command 物件来对Connection 下达命令
其中在使用New 运算子建构DataSetCommand 时,也可以顺便作初值设定的工作,如下语法所示:
Dim 变量As DataSetCommand = New DataSetCommand(Command 对象名)
例如下列范例于宣告Command 对象时,直接指定Command 对象所要执行的命令,以及要透过哪个Connection 对象;并在宣告DataSetCommand 时,直接指定所要使用的Command 对象名称:
Dim strConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:InetPubwwwrootCRCH05MyWeb.mdb" Dim strComStr As String = "Select * From Members" Dim cnA As ADOConnection = New ADOConnection(strConStr) Dim cmA As ADOCommand = New ADOCommand(strComStr, cnA) Dim dscA As ADODataSetCommand = New ADODataSetCommand(cmA)
甚至还可以不需要明确宣告Connection 对象以及Command 对象,直接以命令文字以及联机字符串来代替,如下语法所示:
Dim 变量As DataSetCommand = New DataSetCommand("命令字符串","联机字符 串")
例如下列范例于宣告DataSetCommand 对象时,直接指定DataSetCommand 对象所要执行的命令,以及如何建立Connection 对象和数据源连结。我们在使用这个DataSetCommand 对象时,它会自动建立并管理Command 对象以及Connection 对象:
Dim strConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:InetPubwwwrootCRCH05MyWeb.mdb" Dim strComStr As String = "Select * From Members" Dim dscA As ADODataSetCommand = New ADODataSetCommand(strComStr, strConStr)
这样程序就清楚多了。接下来我们就要利用DataSetCommand 从数据源取回数据,并填入DataSet 对象。以下为宣告的语法:
Dim 变量As DataSet = New DataSet(["DataSet 名称"])
要从数据源取回数据并填入DataSet 对象,我们利用DataSetCommand 对象的FillDataSet 方法。以下为FillDataSet 方法的语法:
DataSetCommand.FillDataSet(DataSet, "DataTable 名称")
我们利用DataSetCommand 和数据源联机,它会自动管理Connection 对象以及Command 对象,所以DataSetCommand 使用的Connection 对象并不需先用Open 方法打开。我们在呼叫DataSetCommand 对象的FillDataSet 时,如果Connection 对象没有开启和数据源的连结,DataSetCommand 对象会自动呼叫Connection 对象的Open 方法将对数据源的连结打开;DataSetCommand 对数据源的操作执行完毕后,会自动将Connection 对象和数据源的连结利用Connection 对象的Close 方法关闭。如果DataSetCommand 在执行FillDataSet 方法时Connection 对象已经开启连结,在执行完毕后DataSetCommand 会维持Connection 对象原来开启连结的状况。下列范例使用DataSetCommand 对象从数据源撷取数据回来,并填入DataSet对象中:
<%@Import Namespace=System.Data.ADO%> <%@Import Namespace=System.Data%> <Script Language="VB" Runat="Server"> Sub Page_Load(Sender As Object, e As EventArgs) Dim strConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:InetPubwwwrootCRCH05MyWeb.mdb" Dim strComStr As String = "Select * From Members" Dim dscA As ADODataSetCommand = New ADODataSetCommand(strComStr,strConStr) Dim dsDataSet As DataSet = New dataset() dscA.FillDataSet(dsDataSet, "Members") '将数据填入数据表内, 并取 名为Members Dim shtI As Short For shtI=1 To (dsDataSet.Tables("Members").Rows.Count).ToInt16 Response.Write(dsDataSet.Tables(0).Rows(shtI-1)("UserName") & "<BR>") Next End Sub </SCRIPT> 上述范例将数据将所取回的DataTable 对象填入DataSet 对象中的Tables 集合,我们可就可以利用Index 或是DataTable 名称的方式来取出集合中的对象。取出DataTable 对象后,我们可以利用DataTable 中Rows 集合的Count 属性取得总共有几笔记录,并将这些记录全部显示出来。由于Rows 集合是由0 开始计算,所以我们最后一个DataRow 对象的Index 值总是比Count属性少1。
|