Сообщение Re[4]: Invalid attempt of read when the reader is closed от 24.02.2021 14:15
Изменено 24.02.2021 14:18 Jack128
Re[4]: Invalid attempt of read when the reader is closed
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, Jack128, Вы писали:
J>>Здравствуйте, Danchik, Вы писали:
D>>>Здравствуйте, Naf2000, Вы писали:
N>>>>При изучении linq2db столкнулся с непониманием, почему чтение закрывается после первого же Update?
N>>>>Нельзя одновременно читать и писать? А как это делать в одно транзакции? Или надо материализовать результат чтения?
D>>>Надо материализовать через ToList()
J>>А зачем ?? Ну то есть — это ж искусственное ограничение, которые linq2db зачем то навязывает клиентам
D>Охренеть. Мы держим открытым reader чтобы не материализировать все обьекты сразу, а тут предъявляют претензии.
Да нет, претензии в том, что вы закрываете ридер, как только пошел другой запрос через тоже соединение. На голом ADO.NET всё работает как.
D>Здравствуйте, Jack128, Вы писали:
J>>Здравствуйте, Danchik, Вы писали:
D>>>Здравствуйте, Naf2000, Вы писали:
N>>>>При изучении linq2db столкнулся с непониманием, почему чтение закрывается после первого же Update?
N>>>>Нельзя одновременно читать и писать? А как это делать в одно транзакции? Или надо материализовать результат чтения?
D>>>Надо материализовать через ToList()
J>>А зачем ?? Ну то есть — это ж искусственное ограничение, которые linq2db зачем то навязывает клиентам
D>Охренеть. Мы держим открытым reader чтобы не материализировать все обьекты сразу, а тут предъявляют претензии.
Да нет, претензии в том, что вы закрываете ридер, как только пошел другой запрос через тоже соединение. На голом ADO.NET всё работает как.
public void SampleSelectTest([IncludeDataSources(false, ProviderName.Firebird)] string context)
{
using (var db = (DataConnection)GetDataContext(context))
{
var connection = db.Connection;
using var transaction = connection.BeginTransaction();
var selectCommand = connection.CreateCommand();
selectCommand.Transaction = transaction;
selectCommand.CommandText = @"
select ""PersonID""
from ""Person""
";
using var reader = selectCommand.ExecuteReader();
while(reader.Read())
{
using var updateCommand = connection.CreateCommand();
updateCommand.Transaction = transaction;
updateCommand.CommandText = string.Format(@"update ""Person"" set ""FirstName"" = 'cfewfwe' where ""PersonID"" = {0}", reader.GetInt32(0));
updateCommand.ExecuteNonQuery();
}
transaction.Rollback();
}
}Re[4]: Invalid attempt of read when the reader is closed
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, Jack128, Вы писали:
J>>Здравствуйте, Danchik, Вы писали:
D>>>Здравствуйте, Naf2000, Вы писали:
N>>>>При изучении linq2db столкнулся с непониманием, почему чтение закрывается после первого же Update?
N>>>>Нельзя одновременно читать и писать? А как это делать в одно транзакции? Или надо материализовать результат чтения?
D>>>Надо материализовать через ToList()
J>>А зачем ?? Ну то есть — это ж искусственное ограничение, которые linq2db зачем то навязывает клиентам
D>Охренеть. Мы держим открытым reader чтобы не материализировать все обьекты сразу, а тут предъявляют претензии.
Да нет, претензии в том, что вы закрываете ридер, как только пошел другой запрос через тоже соединение. На голом ADO.NET всё работает как надо
D>Здравствуйте, Jack128, Вы писали:
J>>Здравствуйте, Danchik, Вы писали:
D>>>Здравствуйте, Naf2000, Вы писали:
N>>>>При изучении linq2db столкнулся с непониманием, почему чтение закрывается после первого же Update?
N>>>>Нельзя одновременно читать и писать? А как это делать в одно транзакции? Или надо материализовать результат чтения?
D>>>Надо материализовать через ToList()
J>>А зачем ?? Ну то есть — это ж искусственное ограничение, которые linq2db зачем то навязывает клиентам
D>Охренеть. Мы держим открытым reader чтобы не материализировать все обьекты сразу, а тут предъявляют претензии.
Да нет, претензии в том, что вы закрываете ридер, как только пошел другой запрос через тоже соединение. На голом ADO.NET всё работает как надо
public void SampleSelectTest([IncludeDataSources(false, ProviderName.Firebird)] string context)
{
using (var db = (DataConnection)GetDataContext(context))
{
var connection = db.Connection;
using var transaction = connection.BeginTransaction();
var selectCommand = connection.CreateCommand();
selectCommand.Transaction = transaction;
selectCommand.CommandText = @"
select ""PersonID""
from ""Person""
";
using var reader = selectCommand.ExecuteReader();
while(reader.Read())
{
using var updateCommand = connection.CreateCommand();
updateCommand.Transaction = transaction;
updateCommand.CommandText = string.Format(@"update ""Person"" set ""FirstName"" = 'cfewfwe' where ""PersonID"" = {0}", reader.GetInt32(0));
updateCommand.ExecuteNonQuery();
}
transaction.Rollback();
}
}