2014-04-30 7 views
1

У меня есть проблема с использованием транзакций в 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:

Может что-то с командой? Например, есть только одно обновление, так что оно автокомментировано или что-то в этом роде?

+0

Вы подавляете все ошибки с этим уловом, чтобы вы никогда не узнали, была ли ошибка. – usr

+0

Я пробовал его без try/catch, он будет поднимать одно и то же исключение, но вместо этого в части отката при коммит-части – Kerman

+0

Код выглядит нормально, как есть. Это означает, что ошибка (которая явно существует) находится в части кода, который не размещен здесь. Либо отправляйте все соответствующие фрагменты, либо создайте небольшой, автономный репрограммирование. Делая последнее, вы, вероятно, найдете ошибку самостоятельно. Можете ли вы воспроизвести ошибку в 10 строках? Готов поспорить, вы не можете. – usr

ответ

0
public void EndTransaction() 
    { 
     mSqlTransaction.Commit(); 
     Close(); 
    } 

Зачем использовать Close() их нет способа. может быть obj.close(); их.

+0

Внутренний метод: public void Закрыть() { mConnection.Close(); } mConnection - это просто свойство SqlConnection – Kerman

Смежные вопросы