如何将Ole Db令牌的db事务用于循环?

时间:2015-04-10 02:19:51

标签: c# sql transactions oledbcommand

有一个有趣的问题,在代码中似乎很容易:

using (OleDbConnection con = new OleDbConnection(……))
{
    OleDbCommand cmd = new OleDbCommand(con);
    OleDbTranscation trans = con.BeginTranscation();
    cmd.CommandText = "update xxx set field1=@field1,field2=@field2 where field3=@field3";

    //Suppose "pCollection" is a collection variable defined before, and this is a stack type.

   Point p = pCollection.Pop();

   while(pCollection.Count!=0)
   {
      cmd.Parameters["@field1"].Value = p.Field1;
      cmd.Parameters["@field2"].Value = p.Field2;
      cmd.Parameters["@field3"].Value = p.Field3;
      cmd.Parameters["@field4"].Value = p.Field4;
      p = pCollection.Pop();
      cmd.ExecuteNonQuery();
   }
   trans.Commit();
}

上面的代码似乎大致正确,但是如果你运行它,你会发现只更新了最后一条记录,因为SqlCommand的参数被后一个循环时间覆盖,并且所有前一个循环都被覆盖了参数是指SqlCommand的相同参数,所以只有最后一次参数'价值观采取行动。所有的转换都指向最后一次更新记录。所以我的问题是如何使每个更新语句在整个转换过程中采取行动(每个更新SQL都有不同的参数值)?

谢谢!

0 个答案:

没有答案