Информация об изменениях

Сообщение 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 всё работает как.

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 всё работает как надо

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();
            }
        }