是不是上一篇太长了,于是,我只要分割它到下个了。
接上一篇:
上篇提到 一个CommandBuilder,这是一个新对象。
它的作用就是:自动生成单表命令,用于将对 DataSet 所做的更改与关联的 sql Server 数据库的更改相协调
因为:da.update()更新命令并“不能”生成 实现DataSet和数据库协调的sql语句.
说白了,DataAdapter只是一个无主意的搬运工,用怎么样的sql语句用到数据库,需要一个“指示”或“指令”
而这个指令或指示就是由CommmandBuilder来说明的,这样搬运工就知道怎么搬进数据库,怎么放好放好(修改)数据。
CommandBuilder具有智能的作用:会自动生成相关的sql语句。所以前面没看到Insert插入sql语句。因为里面有了
newrow,addrow就可以判断是插入记录。
但是,如果设置了 sqlDataAdapter 的 SelectCommand 属性,则可以创建一个 sqlCommandBuilder 对象来自动生成用于
单表更新的 Transact-sql 语句。然后,sqlCommandBuilder 将生成其他任何未设置的 Transact-sql 语句。
每当设置了 DataAdapter 属性,sqlCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个
sqlDataAdapter 与一个 sqlCommandBuilder 对象(或相反)互相关联。
为了生成 INSERT、UPDATE 或 DELETE 语句,sqlCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。
如果在检索到元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。
SelectCommand 还必须至少返回一个主键列或唯一的列。如果什么都没有返回,就会产生 InvalidOperation 异常,不生成命令。
sqlCommandBuilder 还使用由 SelectCommand 引用的 Connection、CommandTimeout 和 Transaction 属性。如果修改了
这些属性中的一个或多个,或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommand、
UpdateCommand 和 DeleteCommand 属性都保留它们以前的值。
如果调用 Dispose,则会解除 sqlCommandBuilder 与 sqlDataAdapter 的关联,并且不再使用生成的命令。
例子:前一例子是插入,现在用一个修改。
界面基本一下,就是按键代码变换一下。
需要说明的是:DataAdapter是一个呆板的搬运工,当搬运到内存中的DataSet的表是没有主键设置的,所以要操作时需要设置。
另外一个是,要定位到一个Row中,用一个Find()方法。
- PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.Click
- DimcnAsNewsqlConnection("DataSource=(local);InitialCatalog=Sales;IntegratedSecurity=False;UserID=sa;Password=123456;")
- DimdaAsNewsqlDataAdapter("select*fromgrade",cn)'搬运工拉好水
- DimdsAsNewDataSet()'本地内存准备好容器来装水
- da.Fill(ds,"mytable")'装水
- DimdrowAsDataRow'定义行变量
- ds.Tables("mytable").PrimaryKey=NewDataColumn(){ds.Tables("mytable").Columns("学号")}'设置内存表中的主键
- drow=ds.Tables("mytable").Rows.Find(TextBox1.Text)'根据学号定准到对应行
- Try
- drow("学号")=TextBox1.Text'对应行赋值
- drow("姓名")=TextBox2.Text
- drow("语文")=TextBox3.Text
- drow("数学")=TextBox4.Text
- drow("英语")=TextBox5.Text
- DimcmdbAsNewsqlCommandBuilder(da)'和数据库打个电话,本地内存有水要运过去
- da.Update(ds,0); background-color:inherit">'上面电话里已经说好了,现在把水运到数据库去
- DataGridView1.DataSource=ds.Tables("mytable")'绑定到控件上显示当前结果
- CatchexAsException
- MessageBox.Show(ex.ToString)
- EndTry
- EndSub
注1:Rows.Find(object),默认提查找主键,当是主键是一个字段时,直接用这个字段。
注2:Rows.Find(object[]),主键是多个字段组成,则用几个字段来组成。用数组来表示,每个元素一个字段名,参数用数组名。
4.4 DataAdapter的Command属性
DataAdapter对象通过4个属性传递数据。
这四个属性必须是Command对象:SelectCommand,InsertCommand,UpdateCommand,DeleteCommand四个对象
如果是查询则是SelectCommand
下例中就是da.SelectCommand,因为sql是select,