CommandBuilder 原来有这样一个作用
下午我在学习使用用 DataAdapter 和 DataSet 对象使用更新一个SQL数据库的表的时候,系统总是提示 “当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand。”后来才知道,原来:
DataAdapter 对象在数据发生变化的时候,并不能自动产生数据库系统所需要的 Transact-SQL 语句,如果不使用 CommandBuilder 而使用 Update 方法,这是不会成功的。而 CommandBuilder 对象能为单个表的数据改变自动产生 Transact-SQL 语句。
Try
' 连接字串和SQL语句;
Dim strConnectionString As String = "database=tempdb;user id=sa;pwd=sa;server=localhost"
Dim strSQLCommand As String = "select * from myTempTable"
' 创建数据连接;
Dim conDataConnection As New SqlConnection
conDataConnection.ConnectionString = strConnectionString
conDataConnection.Open()
' 创建 SQLCommand;
Dim cmdSQLCommand As New SqlCommand(strSQLCommand, conDataConnection)
' 创建 DataAdapter;
Dim daDataAdapter As New SqlDataAdapter(strSQLCommand, conDataConnection)
' 创建 CommandBuilder;
Dim cb As New SqlCommandBuilder(daDataAdapter)
' 创建 DataSet;
Dim dsDataSet As New DataSet
daDataAdapter.Fill(dsDataSet, "myTempTable")
' 创建新行;
Dim drDataRow As DataRow
drDataRow = dsDataSet.Tables("myTempTable").NewRow()
drDataRow.Item("Field1") = 987
drDataRow.Item("Field2") = "789"
' 插入;
dsDataSet.Tables("myTempTable").Rows.Add(drDataRow)
' 更新;
daDataAdapter.Update(dsDataSet, "myTempTable")
' 绑定, 显示;
DataGrid1.DataSource = dsDataSet.Tables("myTempTable").DefaultView
DataGrid1.DataBind()
Catch ex As Exception
Response.Write(Err.Description)
End Try