...
...SqlCommandBuilder cb = new SqlCommandBuilder(da);
conn.Open();
using (SqlTransaction txn = conn.BeginTransaction())
 {
    cb.GetInsertCommand().Transaction = txn;
    cb.GetUpdateCommand().Transaction = txn;
    cb.GetDeleteCommand().Transaction = txn;
    da.Update(dt);
 }
conn.Close();
Console.WriteLine("成功");
Console.ReadKey();
上面的代码使用SqlCommandBuilder 生成更新逻辑,并在事务中执行,为什么报错呢:“如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。”什么意思啊?

解决方案 »

  1.   


    cb.GetInsertCommand().Transaction = txn;
      cb.GetUpdateCommand().Transaction = txn;
      cb.GetDeleteCommand().Transaction = txn;
      da.Update(dt);
    txn.Commit();
      

  2.   

    我忘写txn.Commit()了,不过,
    还是报同样的错误
      

  3.   

    txn.ExecuteNonQuery();//加上这个试试
    txn.Commit();
      

  4.   

    估计是da.Update(dt)执行时,命令生成器CommandBilder自动为da的相应Command设置了值,你先前写的cb.GetInsertCommand().Transaction = txn;
    cb.GetUpdateCommand().Transaction = txn;
    cb.GetDeleteCommand().Transaction = txn;
    被和谐掉了。可以这样试下,去掉你写的这三句代码,改成:da.SelectCommand.Transaction=txn;
      

  5.   

    http://blog.sina.com.cn/s/blog_4b6c8ec30100d50w.html
    http://blog.tianya.cn/blogger/post_show.asp?BlogID=66841&PostID=1888230
    参考。
      

  6.   

    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    conn.Open();
    cb.GetInsertCommand();
    using (SqlTransaction txn = conn.BeginTransaction())
     {
      cb.GetInsertCommand().Transaction = txn;
      cb.GetUpdateCommand().Transaction = txn;
      cb.GetDeleteCommand().Transaction = txn;
      da.Update(dt);
     }
    conn.Close();
    Console.WriteLine("成功");
    Console.ReadKey();我随便添了一句,就成功了,可是,为什么呢?
      

  7.   

    http://blog.sina.com.cn/s/blog_4b6c8ec30100d50w.html
    http://blog.tianya.cn/blogger/post_show.asp?BlogID=66841&PostID=1888230
      

  8.   

    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    conn.Open();
    cb.GetInsertCommand();
    using (SqlTransaction txn = conn.BeginTransaction())
     {
      cb.GetInsertCommand().Transaction = txn;
      cb.GetUpdateCommand().Transaction = txn;
      cb.GetDeleteCommand().Transaction = txn;
      da.Update(dt);
      txn.Commit();
     }
    conn.Close();
    Console.WriteLine("成功");
    Console.ReadKey();我随便添了一句,就成功了,可是,为什么呢?
      

  9.   

    不知道也不想知道,如果你想搞清楚,自己反编译微软的dll查看它的实现,我觉着这样做很不值得。
    那个SqlCommandBuilder根本没必要使用,个人认为它也并不好,自动创建的SQL语句并不是最好的,我更倾向于自己创建SqlCommand,然后给da的InsertCommand、UpdateCommand、DeleteCommand三个属性赋值,这过程中自然也可以设置SqlTransaction,整个过程不会出任何错误,非常严谨。
      

  10.   

    SqlCommandBuilder我觉得还是可以啊,少写好多代码奥