我有一个需要更新多条记录的网页。此页面获取所有信息,然后开始向数据库发送多个UPDATE查询的事务。
foreach row
{
Prepare the query
Hashtable Item = new Hashtable();
Item.Add("Id", Id);
Item.Add("Field1", Field1);
Item.Add("Field2", Field2);
Item.Add("Field3", Field3);
...
}
然后我们启动ytransaction DO CHANGES()
public void execute_NonQuery_procedure_transaction(string StoredProcedure, List<Hashtable> Params)
{
using (MySqlConnection oConnection = new MySqlConnection(ConfigurationManager.AppSettings[DB]))
{
MySqlTransaction oTransaction;
bool HasErrors = false;
oConnection.Open();
oTransaction = oConnection.BeginTransaction();
try
{
MySqlCommand oCommand = new MySqlCommand(StoredProcedure, oConnection);
oCommand.CommandType = CommandType.StoredProcedure;
oCommand.Transaction = oTransaction;
foreach (Hashtable hParams in Params)
{
oCommand.Parameters.Clear();
IDictionaryEnumerator en = hParams.GetEnumerator();
while (en.MoveNext())
{
oCommand.Parameters.AddWithValue("_" + en.Key.ToString(), en.Value);
oCommand.Parameters["_" + en.Key.ToString()].Direction = ParameterDirection.Input;
}
oCommand.ExecuteNonQuery();
}
}
catch (Exception e)
{
HasErrors = true;
throw e;
}
finally
{
if (HasErrors)
oTransaction.Rollback();
else
oTransaction.Commit();
oConnection.Close();
}
}
}
还有其他方法可以做到这一点,或者这是最有效的方法吗?
答案 0 :(得分:2)
这取决于具体情况,例如,如果您有多行更新或添加新行或删除某些行或这些行的组合,这会修改数据库表,那么执行此操作的有效方法是进行批量更新。
请浏览此链接Batch Update
希望这会有所帮助......
答案 1 :(得分:1)
它看起来很好,你最终可能不会清除Command.Parameters列表,但只是在后续迭代中分配值,但这可能导致没有明显的改进。
注意你的投掷是错误的,在C#中不要使用throw e;
而只是throw;
。