有一个有趣的问题,在代码中似乎很容易:
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都有不同的参数值)?
谢谢!