Есть много людей, которые говорят об этом в Интернете, но это, похоже, не работает. Это исключение, которое я получаю:Использование SqlTransaction с SqlDataReader
This SqlTransaction has completed; it is no longer usable.
Вот код
using (SqlConnection locationConnection = new SqlConnection(connectionString))
{
locationConnection.Open();
SqlTransaction transaction = locationConnection.BeginTransaction();
SqlCommand cmd = new SqlCommand("
Select stuff from table A
Insert stuff into table B
Delete stuff from table A", locationConnection, transaction);
using(SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//Doesn't matter
}
}
//Exception happens here
transaction.Commit();
}
Может кто-нибудь пролить свет на то, почему это происходит? Если я переведу фиксацию внутри области SqlDataReader, я получаю исключение, которое необходимо закрыть вначале datareader.
EDIT: Я ответил на свой вопрос и попытаюсь вспомнить, чтобы прийти, примите его через пару дней, когда мне разрешат.
Почему вы используете транзакцию только для выбора? Это всего лишь пример вашего кода? У вас на самом деле есть какие-то манипуляции с данными? Нет никаких причин для транзакции только для выбранного оператора. – Kritner
Fyi, если вы используете 'using'-statement, вам не нужно явно указывать' locationConnection.Dispose' или 'locationConnection.Close'. –
Я выбираю результирующий набор, прежде чем делать изменения, чтобы я мог регистрировать изменения. – user1427105