您的位置:首页 > 产品设计 > UI/UE

对SqlCommandBuilder类理解

2011-12-10 19:50 267 查看
在实现数据的批量导入导出,具体代码如下:

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 类就诞生了。

以上纯属于个人的猜想..


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: