我们可以利用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:\InetPub\wwwroot\CR\CH05\MyWeb.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:\InetPub\wwwroot\CR\CH05\MyWeb.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:\InetPub\wwwroot\CR\CH05\MyWeb.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:\InetPub\wwwroot\CR\CH05\MyWeb.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>