对SqlCommandBuilder类理解
生活随笔
收集整理的這篇文章主要介紹了
对SqlCommandBuilder类理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在實現數據的批量導入導出,具體代碼如下:
1 OpenFileDialog ofd = new OpenFileDialog();2 if (ofd.ShowDialog() == DialogResult.OK)
3 {
4 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
5 {
6 using (SqlCommand comm = conn.CreateCommand())
7 {
8 comm.CommandText = "select * from T_Person";
9 SqlDataAdapter adapter = new SqlDataAdapter(comm);
10 //如果這里比添加這句話,程序就會報錯
11 //SqlCommandBuilder scb = new SqlCommandBuilder(adapter);
12 DataTable table = new DataTable();
13 DataRow row = null;
14 adapter.Fill(table);
15 double proBar = 0;
16
17 string[] lines = File.ReadAllLines(ofd.FileName);
18 double addPra = (double)100 / (double)lines.Length;
19 foreach (string line in lines)
20 {
21 if (isStop)
22 {
23 MessageBox.Show("導入取消");
24 progressBar1.Value = 0;
25 return;
26 }
27
28 proBar += addPra;
29 progressBar1.Value = Convert.ToInt32(proBar);
30 row = table.NewRow();
31 string[] cols = line.Split(' ');
32 row["Name"] = cols[0];
33 row["Age"] = Convert.ToInt32(cols[1]);
34 table.Rows.Add(row);
35 }
36
37 //只能通過SqlCommandBuilder類為adapter.InsertCommand賦值
38 //adapter.InsertCommand = scb.GetInsertCommand();
39
40 //下面都是錯誤的方法
41 //adapter.InsertCommand = new SqlCommand("insert into T_Person(Name,Age) values(@Name,@Age)",conn);
42 //adapter.InsertCommand = new SqlCommand("INSERT INTO [T_Person] ([Name], [Age]) VALUES (@p1, @p2)", conn);
43 adapter.Update(table);
44
45 MessageBox.Show("數據導入成功");
46 }
47 }
運行提示如下錯誤:
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 類就誕生了。 以上純屬于個人的猜想..轉載于:https://www.cnblogs.com/shysky77/archive/2011/12/10/2283491.html
總結
以上是生活随笔為你收集整理的对SqlCommandBuilder类理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扩展Jquery插件处理mouseove
- 下一篇: struts2+spring3.2简单d