System.invalidoperationexception: "с этой командой уже связан открытый datareader, который должен быть закрыт первым".
Я хочу прочитать данные из 2 разных таблиц trxdat и trxitem
но при 2-м чтении я получаю ошибку
System.InvalidOperationException: 'There is already an open DataReader associated with this Command which must be closed first.'
команда и строка все разные
как мне работать с обоими читателями , потому что в каждой строке trxdat я должен читать связанные данные из tritem
Что я уже пробовал:
строку str1 = "выбрать * из таблицы dbo.trxdat где cmp_code = '" + SPGlobal.spcmp_code + " и trx_type = '" + RMSTБЫЛ + "'";
Sqlcommand, который mcmd = новая команда sqlcommand(str1 выглядит следующим образом, SPDConn);
SqlDataReader mrdr = mcmd.Метода executereader();
DataTable dt = новый DataTable();
строку str2 = "выбрать * из таблицы dbo.тритем где cmp_code = '" + SPGlobal.spcmp_code + " и trx_type = '" + RMSTБЫЛ + "и trx_no = '" + trx_no + "'";
SqlCommand icmd = new SqlCommand(str2, SPDConn);
SqlDataReader irdr = icmd.Метода executereader();
Richard MacCutchan
Вам нужно закрыть дубликат считывателя.
Richard Deeming
У вас есть гораздо большая проблема, чем это. Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
j snooze
вместе с тем, что Ричард говорит об использовании параметризованных запросов. Я вижу, что вы создаете datatable и ничего с ним не делаете. Почему бы не заполнить datatable после получения первого считывателя, а затем закрыть первый считыватель и получить данные второго считывателя?