19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 535

ExecuteReader требует, чтобы команда имела транзакцию

20.07.2018, 16:50. Показов 5169. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый день.
Выполняю такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
//ищем в базе даных
                string query = "SELECT * FROM Quotations WHERE ";
                query += "ticker='"+ticker+"' and period='"+ interval + "' and stock_id="+stock_id.ToString()+" and _index="+index.ToString();
                DbCommand command = _wrapper.create_command(_wrapper.create_query(query));
 
                DbDataReader reader = command.ExecuteReader();
                BarPrice bar = null;
                while (reader.Read())
                {                   
                     bar=get_bar_from_reader(reader);
                }
                reader.Close();
Вылетает со ошибкой
Необработанное исключение типа "System.InvalidOperationException" в System.Data.dll

Дополнительные сведения: ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не
У меня действительно есть транзакции, они выполняются в других потоках. В этих транзакциях я пишу инфу в базу данных. Но иногда требуется делать чтение.
Подскажите, пожалуйста, как решить эту проблему? Выставлять какой-то флаг, что у меня в других потоках идет транзакция и просто ожидать пока он завершиться? Или может и чтение тоже дать в транзакциях? У меня тогда как, метод command.ExecuteReader() будет ждать когда завершиться другая транзакция или как?
Какие еще есть варианты решения?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2018, 16:50
Ответы с готовыми решениями:

ExecuteReader требует открытого и доступного соединения. Текущее состояние подключения закрыто
Здравствуйте. Возникла проблема с подключением сервера, он просит открыть к нему доступ. Как это сделать я не знаю. Подскажите пожалуйста....

Ошибка "ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто. "
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OleDb; using System.Data;...

Как на изображение наложить сетку, чтобы одна ячейка имела размеры 64*32, и чтобы каждая ячейка нумеровалась
Добрый день. Подскажите пожалуйста. Имеется изображение 320*640 Необходимо на это изображение наложить сетку, чтобы одна ячейка имела...

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17909 / 14003 / 5347
Регистрация: 17.03.2014
Сообщений: 28,665
Записей в блоге: 1
20.07.2018, 21:05
megabax, если необходимо иметь возможность читать еще не записанные данные, то следует назначить команде транзакцию как написано в исключении. Иначе следует создать другое подключение и читать через него.
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 535
22.07.2018, 11:49  [ТС]
OwenGlendower, В этом случае какие данные мне прочитает команда? Те что были до начала другой транзакции или кривые промежуточные данные, которые были на момент чтения когда другая транзакция еще не заврешена?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17909 / 14003 / 5347
Регистрация: 17.03.2014
Сообщений: 28,665
Записей в блоге: 1
22.07.2018, 13:01
megabax, я уже ответил на этот вопрос в сообщении #2
0
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 535
23.07.2018, 08:47  [ТС]
Я сделал чтение тоже в транзакции
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        public void read_bars_count()
        {
            _bars_count = 0;
 
            /*string query = "SELECT COUNT(_datetime) FROM Quotations WHERE ";
            query += "ticker=@ticker and period=@period and stock_id=@stock_id ";
            query += "GROUP BY ticker, period, stock_id";*/
            /*string query = "SELECT COUNT(_datetime) FROM Quotations WHERE ";
            query += "ticker='"+ticker+"' and period='"+ interval + "' and stock_id="+stock_id.ToString()+" ";
            query += "GROUP BY ticker, period, stock_id";*/
 
            string query = "SELECT count, beg_loaded, end_loaded, beg_date FROM SimbolsInfo WHERE ";
            query += "ticker='" + ticker + "' and period='" + interval + "' and stock_id=" + stock_id.ToString() + " ";
 
            DbCommand command = _wrapper.create_command(_wrapper.create_query(query));
            command.Transaction = _wrapper.get_transaction(IsolationLevel.ReadCommitted);
 
            /*command.Parameters.Add(_wrapper.create_parameter("@ticker", ticker));
            command.Parameters.Add(_wrapper.create_parameter("@period", interval));
            command.Parameters.Add(_wrapper.create_parameter("@stock_id", stock_id));*/
 
            DbDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                if (!reader.IsDBNull(3)) _beg_datetime = reader.GetDateTime(3);
                if (reader.IsDBNull(0))
                {
                    _bars_count = 0;
                    break;
                }
                _bars_count = reader.GetInt32(0);
                _beg_date_loaded = reader.GetDateTime(1);
                _end_date_loaded = reader.GetDateTime(2);
            }
 
            reader.Close();
            command.Transaction.Commit();
        }
Теперь на строке
C#
1
command.Transaction = _wrapper.get_transaction(IsolationLevel.ReadCommitted);
вылазит исключение
Дополнительные сведения: SqlConnection не поддерживает параллельные транзакции.
0
Эксперт .NET
 Аватар для Usaga
12878 / 8924 / 1323
Регистрация: 21.01.2016
Сообщений: 33,527
23.07.2018, 08:52
Цитата Сообщение от megabax Посмотреть сообщение
У меня действительно есть транзакции, они выполняются в других потоках.
Не надо так делать. Не передавайте объект подключения между потоками, не растягивайте транзакцию на несколько потоков. Открыли подключение в рамках транзакции, выполнили что надо, закоммитили транзакцию и закрыли подключение. Всё.

Не надо говнокодить.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17909 / 14003 / 5347
Регистрация: 17.03.2014
Сообщений: 28,665
Записей в блоге: 1
23.07.2018, 09:46
Цитата Сообщение от megabax Посмотреть сообщение
вылазит исключение
Дополнительные сведения: SqlConnection не поддерживает параллельные транзакции.
Нужно использовать одну и ту же транзанкцию, а не создавать новую.
1
19 / 19 / 14
Регистрация: 06.08.2009
Сообщений: 535
23.07.2018, 10:13  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нужно использовать одну и ту же транзанкцию, а не создавать новую.
А если я читаю в другом потоке (другой срез данных). Даже если я сделаю как посоветовал Usaga, буду закрывать конекшены когда закончиться транзакция и открывать потом их вновь все равно есть вероятность, что потоки будут одновременно обращаться в БД. Как разрулить данную ситуацию? Выставлять флаг и ждать, чтобы другие потоки ждали, когда обращающийся к БД поток закончит транзакцию?
И почему я так делаю, через много потоков. Дело в том, что я постоянно должен подгружать котировки, которые я беру через некий биржевой апи, по нескольким инструментам. В одном запросе через апи можно указать только 1 инструмент. Поэтому приходиться делать несколько запросов в разных потоках и о что получено по запросу писать в базу данных.
0
Эксперт .NET
 Аватар для Usaga
12878 / 8924 / 1323
Регистрация: 21.01.2016
Сообщений: 33,527
23.07.2018, 10:16
Цитата Сообщение от megabax Посмотреть сообщение
есть вероятность, что потоки будут одновременно обращаться в БД. Как разрулить данную ситуацию?
Вас это колышить не должно никак. СУБД прекрасно разруливает паралелльные к ней обращения. И транзакции тоже не обязательно будут блокировать обращения.

Цитата Сообщение от megabax Посмотреть сообщение
Дело в том, что я постоянно должен подгружать котировки, которые я беру через некий биржевой апи, по нескольким инструментам. В одном запросе через апи можно указать только 1 инструмент. Поэтому приходиться делать несколько запросов в разных потоках и о что получено по запросу писать в базу данных.
Ну так в каждом потоке формируйте своё подключение и свою транзакцию. Не надо всё в кучу смешивать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2018, 10:16
Помогаю со студенческими работами здесь

Как сделать, чтобы панель имела фокус?
Помогите разобраться с: 1)Не работает и ничего не говорит такой код, что и где нужно ещё добавить, изменить, удалить?: ...

Как сделать, чтобы процедура имела доступ к компонентам?
Создал процедуру после {$R *.dfm}Всё работает, но когда пишу в ней код edit1.text:='привет'; то выдается ошибка: Undeclared identifier:...

Надо чтобы радиокнопка имела значение прошлого месяца
Надо чтобы радиокнопка имела значение прошлого месяца я пишу value='<%=Format(DateAdd('m',-1,Date()),'mmm')%>' а IIS при...

Подберите значение параметра a таким образом, чтобы система имела единственное решение
\begin{cases} & \text{ 2x + 3y } = 7 \\ & \text{ 3x + ay } = 3 \\ & \text{ 8x + 18y } = 10 \end{cases} Очевидно, что решение будет...

Создать СЛАУ размерности 1000х1000, чтобы система имела только одно решение
Здравствуйте, как можно создать СЛАУ большой размерности в виде матрицы в c++, чтобы система имела только одно решение?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Динамические массивы в C++ - создание и использование
NullReferenced 28.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 28.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 28.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 27.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 27.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 27.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru