Я получаю следующую ошибку с перерывами. Уже открыт DataReader, связанный с этой Командой, который должен быть закрыт первым.Существует уже открытый DataReader, связанный с этой командой, без вложенных datareaders
Я читал, что это может произойти, когда в одном соединении есть вложенные DataReaders, но в моем случае я использую следующий код для выполнения всех запросов.
private SqlTransaction Transaction { get; set; }
private SqlConnection Connection { get; set; }
private DbRow Row {get; set;}
public Row Exec(string sql){
try{
//Begin connection/transaction
Connection = new SqlConnection(connectionString);
Connection.Open();
Transaction = Connection.BeginTransaction("SampleTransaction");
//create command
SqlCommand command = new SqlCommand(sql, Connection);
command.Transaction = Transaction;
//execute reader and close it
//HERE IS THE PROBLEM, THE READER ALWAYS READ UNTIL THE END
//BEFORE ANOTHER CAN BE OPENED
reader = command.ExecuteReader();
while (reader.Read())
{
object[] value = new object[reader.FieldCount];
reader.GetValues(value);
List<object> values = new List<object>(value);
Rows.Add(values);
}
reader.Close();
Transaction.Commit();
Connection.Dispose();
Connection = null;
}
catch
{
Transaction.Rollback();
Connection.Dispose();
Connection = null;
}
finally
{
if (reader != null && !reader.IsClosed) reader.Close();
}
}
Таким образом, результат сохраняется в объекте, и нет вложенных считывателей. Я также читал, что добавление в строку соединения «MultipleActiveResultSets = True» может решить проблему при использовании вложенных считывателей. Это решение также решает мою проблему? Поскольку ошибка является промежуточной и происходит только в рабочей среде, я не могу ее много раз проверять.
There is already an open DataReader associated with this Command which must be closed first. at
System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) at
System.Data.SqlClient.SqlInternalTransaction.Rollback() at
System.Data.SqlClient.SqlTransaction.Rollback() at
Application.Lib.DB.DBSQLServer.Rollback()
at Application.Lib.DB.DBSQLServer.Execute(String sql, Dictionary`2 parameters,
Nullable`1 timeout, Boolean useTransaction) at
Application.UtilDB.Execute(String sql, Dictionary`2 parameters, Nullable`1
timeout, Boolean useTransaction) in c:\Application\DBUtil.cs:line 37 at
Application.A.CollectionFromDataBase(Int32 cenId,
IDB db, Int32 includeId, Boolean allStatus) in c:\Application\Activities.cs:line 64 at
Application.ActivitiesController.CheckForConflictsBeforeSave(String aulId, String insId) in c:\Application\AlocController.cs:line 212
Не могли бы вы вывести код для этого всего метода? –
@BryanCrosby Я только что отредактировал вопрос, это не полный код, но это важная часть. – dinhokz
Можете ли вы также опубликовать трассировку стека для исключения? –