• 对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 类就诞生了。
    以上纯属于个人的猜想..
    
    
  • 相关阅读:
    零售定价(最终价格计算)(三)
    SAP数据表(一)商品表
    BizTalk 2006 R2 如何实现EDI报文的接收处理
    Simulate a Windows Service using ASP.NET to run scheduled jobs
    看曾士强评胡雪岩
    Smart Client Software Factory 初试
    Asp.net Dynamic Data之四定义字段的显示/编辑模板和自定义验证逻辑
    To set a 64bit mode IIS installation to 32bit mode
    集中日志查询平台方案(Draft)
    .net开发框架比较
  • 原文地址:https://www.cnblogs.com/shysky77/p/2283491.html
Copyright © 2020-2023  润新知