#asp.net #mysql #transactions
#asp.net #mysql #транзакции
Вопрос:
У меня есть веб-страница, на которой необходимо обновить несколько записей. Эта страница получает всю информацию, а затем начинает транзакцию, отправляющую несколько запросов на ОБНОВЛЕНИЕ в базу данных.
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
ДЕЛАТЬ ИЗМЕНЕНИЯ ()
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();
}
}
}
Есть ли другой способ сделать это или это наиболее эффективный способ?
Ответ №1:
Это зависит от ситуации, например, если у вас есть несколько обновлений строк или добавление новых строк или удаление некоторых строк или их комбинация, что изменяет таблицу базы данных, то эффективный способ сделать это — выполнить пакетное обновление…
Пожалуйста, перейдите по этой ссылке Пакетное обновление
Надеюсь, это поможет…
Ответ №2:
для меня это выглядит нормально, в конечном итоге вы можете не очистить команду.Список параметров, но просто присваивает значения на следующих итерациях, но, вероятно, это не приводит к видимым улучшениям.
обратите внимание, что ваш бросок неверен, в C # не используйте throw e;
, а просто throw;
.