对SqlCommandBuilder类理解
2011-12-10 19:50
267 查看
在实现数据的批量导入导出,具体代码如下:
运行提示如下错误:
System.InvalidOperationException: 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand.
只需在上面代码中添加一句话,即可:
OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) { using (SqlCommand comm = conn.CreateCommand()) { comm.CommandText = "select * from T_Person"; SqlDataAdapter adapter = new SqlDataAdapter(comm); //如果这里比添加这句话,程序就会报错 //SqlCommandBuilder scb = new SqlCommandBuilder(adapter); DataTable table = new DataTable(); DataRow row = null; adapter.Fill(table); double proBar = 0; string[] lines = File.ReadAllLines(ofd.FileName); double addPra = (double)100 / (double)lines.Length; foreach (string line in lines) { if (isStop) { MessageBox.Show("导入取消"); progressBar1.Value = 0; return; } proBar += addPra; progressBar1.Value = Convert.ToInt32(proBar); row = table.NewRow(); string[] cols = line.Split(' '); row["Name"] = cols[0]; row["Age"] = Convert.ToInt32(cols[1]); table.Rows.Add(row); } //只能通过SqlCommandBuilder类为adapter.InsertCommand赋值 //adapter.InsertCommand = scb.GetInsertCommand(); //下面都是错误的方法 //adapter.InsertCommand = new SqlCommand("insert into T_Person(Name,Age) values(@Name,@Age)",conn); //adapter.InsertCommand = new SqlCommand("INSERT INTO [T_Person] ([Name], [Age]) VALUES (@p1, @p2)", conn); adapter.Update(table); MessageBox.Show("数据导入成功"); } }
运行提示如下错误:
System.InvalidOperationException: 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand.
只需在上面代码中添加一句话,即可:
SqlCommandBuilder scb = new SqlCommandBuilder(adapter);就可以正常运行。
那么为什么会出现这种情况呢?
我想这是因为adapter它只是负责充当连接数据源与DataSet,DataTable类之间的桥梁,它只能按你提供给它的Sql语句从数据源读取数据到DataSet,DataTable类,而不会自己做凭空的猜想,也就是如果你想将修改的后得数据在adapter.update(table)回数据源,那么它就会报错,为什么呢?原因是你没有提供给它更新的sql语句(别忘了你之前只提供给它查询的sql语句),自然它就不知道如何处理,所以就抛出异常让你来处理了。
那么如果你确实又需要根据查询的结果,做修改然后更新回数据源,要怎么办呢?一个adapter又只能接受一个sql语句,于是SqlCommandBuilder类就派上用场了,
SqlCommandBuilder scb = new SqlCommandBuilder(adapter)
这句话就相当于它帮助adapter做了猜想,于是你就可以更新,删除,插入了....是不是很神奇?
adapter自己无法做猜想,于是微软就创建了一个类为它做猜想,于是SqlCommandBuilder 类就诞生了。
以上纯属于个人的猜想..
相关文章推荐
- asp.net中使用sqlcommandbuilder (转)
- 用SqlCommandBuilder 实现批量更新
- SqlDataAdapter.Update()方法与SqlCommandBuilder
- SqlCommandBuilder 对象
- SqlCommandBuilder如何实现批量更新
- 用SqlCommandBuilder 实现批量更新
- 用SqlCommandBuilder 实现批量更新
- 用SqlCommandBuilder 实现批量更新
- DataTable通过SqlCommandBuilder自动更新解决办法
- SqlCommandBuilder 类
- DataSet SqlCommandBuilder添加修改删除数据
- 用SqlCommandBuilder 实现批量更新
- 用SqlCommandBuilder 实现批量更新
- SqlCommandBuilder 实现批量更新
- SqlCommandBuilder 删除与更新的用法,附代码
- 用SqlCommandBuilder 实现批量更新
- SqlCommandBuilder对像来自动构建sql命令
- SqlCommandBuilder如何实现批量更新
- SqlCommandBuilder
- 用SqlCommandBuilder 实现批量更新