在实现数据的批量导入导出,具体代码如下:
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 类就诞生了。
以上纯属于个人的猜想..