четверг, 12 апреля 2012 г.

C#: Собираем вместе команды и транзакции

Если нужно отправить в базу много команд - надо сразу делать вот так:

List < sqlcommand >  sqlCommands = new List < sqlcommand > ();
foreach (ParsedAddress parsedAddress in parsedAddresses)
{
    if (parsedAddress.IsError)
        continue;

    SqlCommand sqlCommand = new SqlCommand(sqlcmd_SAVE_PARSED_VALUES);
    sqlCommand.Parameters.Add(new SqlParameter("Param1", "Param1"));
    SqlParameter NullableParameter = new SqlParameter("NullableParameter", SqlDbType.Int);
    NullableParameter.IsNullable = true;
    if (itemToWrite.NullableValue != null)
        NullableParameter.Value = itemToWrite.NullableValue.ID;
    else
        NullableParameter.Value = DBNull.Value;
    sqlCommand.Parameters.Add(NullableParameter);
    sqlCommand.Parameters.Add(new SqlParameter("Param2", "Param2"));
    sqlCommand.Parameters.Add(new SqlParameter("Param3", 13));
    sqlCommands.Add(sqlCommand);
}
SqlConnection connection = new SqlConnection(connectionStringWrite);
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
try
{
    foreach (SqlCommand cmd in sqlCommands)
    {
        cmd.Connection = connection;
        cmd.Transaction = transaction;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
    }
    transaction.Commit();
}
catch (SqlException sqlError)
{
    transaction.Rollback();
    throw sqlError;
}
finally
{
    connection.Close();
}

Тогда в случае exception-а произойдёт Rollback и ничего не случится.

А Exception уйдёт "наверх", где его можно будет обработать.

Комментариев нет:

Отправить комментарий