Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对循环中的OleDb令牌位置使用db Transaction?_C#_Sql_Transactions_Oledbcommand - Fatal编程技术网

C# 如何对循环中的OleDb令牌位置使用db Transaction?

C# 如何对循环中的OleDb令牌位置使用db Transaction?,c#,sql,transactions,oledbcommand,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

您会遇到一个有趣的问题,代码似乎很简单:

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都有不同的参数值


谢谢

也许给我们没有语法错误的代码?我想你是想在你创建的事务中登记你的命令。尝试OleDbCommand构造函数重载,该重载也会接受事务。@饼干:谢谢。然而,我恐怕这没有帮助。您只更改了转换的顺序,但没有解决参数将被重写的问题。结果是只更新了最后一条记录。您是否尝试过在while循环中每次创建单独的OleDbCommand实例?@bizzes:我知道这可以做到,因为我将为一个片段分配一个命令,但我希望整个循环作为一个完整的片段。