日期:2014-05-17  浏览次数:20869 次

谁帮我解一下SqlDataAdapter的相关方法疑惑.
在将数据修改或是新增到数据中时,我是循环一笔笔更新到数据中.
我看很多例子直接用SqlDataAdapter.Update方法直接修改到数据库了,我不明白它是通过什么判断知道应该修改哪些数据进系统的.
研究了半天发现SqlCommandBuilder会根据Select语句自动创建,新增删的语句.
但有些时候别人的例子没有用SqlCommandBuilder创建,新增删的语句也更新进去了.

还有创建了 SqlCommandBuilder cmdbder = new SqlCommandBuilder(adpt);之后,没有将cmdbder创建的新增删的语句传给SqlDataAdapter.Update呀.

问题:
1.能否查看SqlCommandBuilder创建后的新增删语句是怎么样的?
2.更新过程的原理是怎么样的?



------解决方案--------------------
SqlDataAdapter.Update这个方法要根据dataset来删除的,至于没有sql语句是因为update这个方法是这个控件就带有的,就好像有的系统方法一样,可以这么理解。
------解决方案--------------------
DataTable绑定dataGridView1后,对dataGridView1的操作,就相当于操作DataTable.
DataTable的行有一个DataRowState 状态,根据操作赋于不同值.

Unchanged 没有变化, Added 新增, Modified修改 Deleted删除. 还有一个Detach什么的... 

Update就是根据DataRowState进行更改数据库的.

SqlCommandBuilder cmdbder = new SqlCommandBuilder(adpt);
这一句是调用SqlCommandBuilder自动生成sql语句. 因为构造函数传入的是适配器,所以相关的语句已经帮你赋值给适配器了.
使用SqlCommandBuilder前提是表必须要有主键,否则出错.

也可以手动传入对应的SqlCommand给适配器.

然后调用Update更新.
------解决方案--------------------
查看SqlCommandBuilder生成的语句.
调用
 SqlCommandBuilder cmdbder = new SqlCommandBuilder(adpt);

===========================================
cmdbder .GetUpdateCommand().CommandText;
cmdbder .GetInsertCommand().CommandText;
cmdbder .GetDeleteCommand().CommandText;

输出到日志,变量 ,Debug都可以看到.