У меня есть проблема с использованием транзакций в ASP.NETОшибка при использовании SqlTransaction
Каждый раз, когда я использую код ниже я получаю исключение:
Этот SqlTransaction завершил; он больше не используется.
Я искал всюду (включая переполнение стека), как решить эту проблему, но все работает.
Я пытаюсь вставить запись в db (я использую SQL Server). Смотрите код ниже:
Database db = new Database();
db.Connect();
SqlCommand command = new SqlCommand(SQL_UPDATE_ADRESA, db.Connection);
command.Parameters.Add(new SqlParameter("@pPersonID", SqlDbType.Int)).Value = personID;
command.Parameters.Add(new SqlParameter("@pStreet", SqlDbType.VarChar, 30)).Value = street;
command.Parameters.Add(new SqlParameter("@pCity", SqlDbType.VarChar, 30)).Value = city;
db.BeginTransaction();
command.Transaction = db.SqlTransaction;
int rows = 0;
try
{
rows = db.ExecuteNonQuery(command);
db.EndTransaction();
}
catch
{
rows = -1;
db.Rollback();
}
db.Close();
return rows;
методы и свойства, которое называют в классе "База данных" являются:
недвижимости:
private SqlTransaction mSqlTransaction = null;
public SqlTransaction SqlTransaction
{
get { return mSqlTransaction; }
}
Методы:
public void BeginTransaction()
{
mSqlTransaction = mConnection.BeginTransaction(IsolationLevel.Serializable);
}
public void EndTransaction()
{
mSqlTransaction.Commit();
Close();
}
public void Rollback()
{
mSqlTransaction.Rollback();
}
Я пытался SET IMPLICIT_TRANSACTIONS ON на SQL Server, переписать код (использование, не используя D atabase и другие вещи, но я не вижу, где проблема).
Это исключение бросается каждый раз, когда я пытаюсь использовать эту команду.
EDIT:
Переменной «строка» равно 1 после выполнения, поэтому запись вставлена правильно, но только после этого, программа генерирует исключение в «Commit», так что это будет поймать заявление и вот это снова вызывает исключение при вызове метода отката. После этого сбоя db откат и ничего не меняется.
EDIT2:
Может что-то с командой? Например, есть только одно обновление, так что оно автокомментировано или что-то в этом роде?
Вы подавляете все ошибки с этим уловом, чтобы вы никогда не узнали, была ли ошибка. – usr
Я пробовал его без try/catch, он будет поднимать одно и то же исключение, но вместо этого в части отката при коммит-части – Kerman
Код выглядит нормально, как есть. Это означает, что ошибка (которая явно существует) находится в части кода, который не размещен здесь. Либо отправляйте все соответствующие фрагменты, либо создайте небольшой, автономный репрограммирование. Делая последнее, вы, вероятно, найдете ошибку самостоятельно. Можете ли вы воспроизвести ошибку в 10 строках? Готов поспорить, вы не можете. – usr