public static DataSet SelectSqlRows(string connectionString,
string queryString, string tableName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(queryString, connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter); connection.Open(); DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tableName); //code to modify data in DataSet here builder.GetUpdateCommand(); //Without the SqlCommandBuilder this line would fail
adapter.Update(dataSet, tableName);
return dataSet;
}
}
既然最终是用SqlCommandBuilder创建SqlCommand,然后执行,为什么不直接创建一个SqlCommand,然后执行它的ExcuteNonQuery()?而是创建了Dataset,Dataadapter,还得Fill,然后adapter.Update,而adapter.Update无非就是执行了个ExcuteNonQuery.ExcuteNonQuery,在这里质疑SqlDataAdapter+SqlCommandBuilder的高效性,这是问题一;
问题二:上面如果不用SqlCommandBuilder,据说是这样“当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句”
那如果我只进行了一句update,当然数据库执行这句时根据 where条件也可能对表进行了大量的查找,但不一定将表全查玩就可能查找到了,而上面“当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句”貌似是全表迭代,那这时它的高效性?当然如果对一个表进行了比较复杂的操作,而上面一次迭代完成应该还是比较高效的。但我觉得平时写sql语句都是对表的操作,而他的“当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句"又是怎么实现的那?ado.net连接其他的数据库时,能实现这种吗?还是其他的数据库只实现了ado的接口?
绑定个小问题3:为什么我的CSDN自动登录主页,社区都正常,而我一点发贴有时又不正常了,要我重新登陆,登录后还不是返回发贴页面,郁闷!
string queryString, string tableName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(queryString, connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter); connection.Open(); DataSet dataSet = new DataSet();
adapter.Fill(dataSet, tableName); //code to modify data in DataSet here builder.GetUpdateCommand(); //Without the SqlCommandBuilder this line would fail
adapter.Update(dataSet, tableName);
return dataSet;
}
}
既然最终是用SqlCommandBuilder创建SqlCommand,然后执行,为什么不直接创建一个SqlCommand,然后执行它的ExcuteNonQuery()?而是创建了Dataset,Dataadapter,还得Fill,然后adapter.Update,而adapter.Update无非就是执行了个ExcuteNonQuery.ExcuteNonQuery,在这里质疑SqlDataAdapter+SqlCommandBuilder的高效性,这是问题一;
问题二:上面如果不用SqlCommandBuilder,据说是这样“当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句”
那如果我只进行了一句update,当然数据库执行这句时根据 where条件也可能对表进行了大量的查找,但不一定将表全查玩就可能查找到了,而上面“当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句”貌似是全表迭代,那这时它的高效性?当然如果对一个表进行了比较复杂的操作,而上面一次迭代完成应该还是比较高效的。但我觉得平时写sql语句都是对表的操作,而他的“当应用程序调用 Update 方法时,DbDataAdapter 根据 DataSet 中配置的索引顺序为每一行检查 RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句"又是怎么实现的那?ado.net连接其他的数据库时,能实现这种吗?还是其他的数据库只实现了ado的接口?
绑定个小问题3:为什么我的CSDN自动登录主页,社区都正常,而我一点发贴有时又不正常了,要我重新登陆,登录后还不是返回发贴页面,郁闷!
解决方案 »
- 请教各位:开发这样的小程序需要多长时间。
- C#怎么样调用带默认参数的存储过程, 也就是说默认参数就取默认的
- wince下form不能设置背景图片,我该怎么办
- 怎么样判断和限制你输入的字符
- 用户控件的MouseEnter和MouseLeave事件
- C#中是否有类似于VB中的StrConv(byte, vbUnicode)函数呀?实现相似功能!
- 怎么把radiobutton的名字放在这个radiobutton的正下方?
- 简单工厂模式和门面模式的问题
- smi 是什么文件,怎么和mpg在一起? edi 文件可以转换为xml ?
- 有没有c#调用GDAL库的大神,帮忙测试下程序,有偿!
- 问个语法的,static
- C#自动编号问题
2.这个是针对内存中已经读入的DataTable来说的,与具体的数据库无关,只是在检查完更改状态之后,生成的命令与数据库有关,与你创建的DataAdapter对象有关。但这个操作,即使你要手动保存的话,也要是做的。
3.现在CSDN总是在抽风...
另外我的理解是,用ExcuteNonQuery(),是直接对数据库进行操作。而用dataSet,是数据库的副本,DataCommandBuilder的主要作用就是减轻对dataSet操作时的工作量。许多时候,DataCommandBuilder还是非常有用滴
通过使用Ole DB也能使用很多其他类型的数据库,不过效率可能会低些。
2.SqlCommandBuilder生成的语句,我从不手动写。如:UPDATE dbo.user_memo
SET user_id = @user_id, content = @content, table_no = @table_no, mobile_no = @mobile_no, email = @email,
customer_id = @customer_id, next_time = @next_time, weeks = @weeks, memo_type = @memo_type,
send_type = @send_type, deleted = @deleted, state = @state, with_me = @with_me, my_phone = @my_phone,
my_email = @my_email
WHERE (id = @Original_id) AND (user_id = @Original_user_id) AND (content = @Original_content) AND
(table_no = @Original_table_no) AND (mobile_no = @Original_mobile_no) AND (email = @Original_email) AND
(customer_id = @Original_customer_id) AND (next_time = @Original_next_time) AND (weeks = @Original_weeks) AND
(memo_type = @Original_memo_type) AND (send_type = @Original_send_type) AND (deleted = @Original_deleted) AND
(state = @Original_state) AND (with_me = @Original_with_me) AND (@IsNull_my_phone = 1) AND (my_phone IS NULL)
AND (@IsNull_my_email = 1) AND (my_email IS NULL) OR
(id = @Original_id) AND (user_id = @Original_user_id) AND (content = @Original_content) AND
(table_no = @Original_table_no) AND (mobile_no = @Original_mobile_no) AND (email = @Original_email) AND
(customer_id = @Original_customer_id) AND (next_time = @Original_next_time) AND (weeks = @Original_weeks) AND
(memo_type = @Original_memo_type) AND (send_type = @Original_send_type) AND (deleted = @Original_deleted) AND
(state = @Original_state) AND (with_me = @Original_with_me) AND (my_phone = @Original_my_phone) AND
(@IsNull_my_email = 1) AND (my_email IS NULL) OR
(id = @Original_id) AND (user_id = @Original_user_id) AND (content = @Original_content) AND
(table_no = @Original_table_no) AND (mobile_no = @Original_mobile_no) AND (email = @Original_email) AND
(customer_id = @Original_customer_id) AND (next_time = @Original_next_time) AND (weeks = @Original_weeks) AND
(memo_type = @Original_memo_type) AND (send_type = @Original_send_type) AND (deleted = @Original_deleted) AND
(state = @Original_state) AND (with_me = @Original_with_me) AND (@IsNull_my_phone = 1) AND (my_phone IS NULL)
AND (my_email = @Original_my_email) OR
(id = @Original_id) AND (user_id = @Original_user_id) AND (content = @Original_content) AND
(table_no = @Original_table_no) AND (mobile_no = @Original_mobile_no) AND (email = @Original_email) AND
(customer_id = @Original_customer_id) AND (next_time = @Original_next_time) AND (weeks = @Original_weeks) AND
(memo_type = @Original_memo_type) AND (send_type = @Original_send_type) AND (deleted = @Original_deleted) AND
(state = @Original_state) AND (with_me = @Original_with_me) AND (my_phone = @Original_my_phone) AND
(my_email = @Original_my_email)
和PB一样,同一条记录,两个客户端查询出来,一个客户端修改了,这时另一个客户端是修改不了的(因为本次修改,针对的是查询出来的记录,而这条记录已被修改过,针对以前的数据进行修改,是没有意义的,对业务逻辑来讲也是不允许的。)
说白了,那个性能的确不高,特别是批量操作的时候,还是只能逐条记录来,效率很低,所以我Update过程基本上都是调用SqlCommand直接执行,不用SqlDataAdapter封装,更不用SqlCommandBuilder产生.