dom71_01 Ответов: 4

Заполните sqldatatable строкой из sqldatareader


Привет,
У меня небольшая проблема, мне нужна ваша поддержка..
Вот такая ситуация:
Я сделал запрос с помощью команды sqlcommand ed a slqdatareader, чтобы прочитать результат, для каждой строки, полученной из этого запроса, мне нужно сделать еще один запрос.
Я написал цикл while, если datareader имеет строки, а datareader читает, мне нужно сделать еще один запрос в другой таблице, используя значение datareader[0] в качестве параметра, и я вставлю каждую строку в таблицу; когда цикл закончится, таблица будет источником данных таблицы данных. Мой вопрос заключается в том, как я могу вставить каждую отдельную строку из sqldatareader в таблицу ?
Язык-C#.
Заранее спасибо.
Доменико.

Что я уже пробовал:

Я погуглил и попробовал решения varius, но ничего подходящего для моей проблемы.

CHill60

Покажите код, который у вас есть до сих пор, чтобы дать нам контекст

Aydin Homay

Что такое стол? это DataTable, DataSet, или Вы имеете в виду DataGridView

4 Ответов

Рейтинг:
2

dom71_01

Спасибо,
но это не то, что я ищу; я знаю, как сделать CRUD-операции с базой данных SQL. Моя проблема в другом. Я делаю запрос к таблице базы данных, и с каждой записью, возвращаемой ею, мне нужно выполнить еще один запрос к другой таблице и вставить каждый результат в sqldatatable, а затем использовать эту последнюю таблицу в качестве источника данных для представления сетки. Эта таблица не является объектом базы данных SQL.
С уважением.
Д-Р.


Aydin Homay

Я думаю, что вместо того, чтобы написать комментарий, вы опубликовали ответ на свой собственный вопрос. Я собираюсь обновить свое решение чтобы покрыть ваш вопрос вы также можете удалить этот ответ ;-)

Рейтинг:
1

Aydin Homay

Привет,

В более общем виде если вы ищете вставку записи в базу данных SQL вы можете найти хорошую и очень хорошо объясненную статью в приведенных ниже ссылках:

Просто ADO.NET чтение, вставка, обновление и удаление базы данных с помощью C#.[^]

Вставка значений в базу данных SQL Server с помощью ado.net через C# - переполнение стека[^]

После того, как вы убедитесь, что знаете, как делать CRUD на БД через ADO.Затем мы можем продолжить следующие шаги:

Вы сохранили результат запроса в sqlDataReader теперь вам нужно создать пользовательский DataTable это содержит те же самые столбцы (DataColumns) что ваш sqlDataReader содержит, а затем использовать Rows собственность компании DataTable чтобы добавить записи одну за другой и в конце привязать ваш DataTable к вашему DataGridView.

var dataTable = new DataTable();
dataTable.Columns.Add("Col1");
dataTable.Columns.Add("Col2");
dataTable.Rows.Add(new object[]{"Rod", "Stephens"});
var bindingSource = new BindingSource();
bindingSource.DataSource = dataTable;
DataGridView1.DataSource = bindingSource;


Более полный пример можно найти по следующей ссылке:
Создайте DataTable и привяжите его к DataGridView в C#C# Helper[^]


Если это не решило вашу проблему, то, пожалуйста, оставьте комментарий, и я помогу Вам улучшить свое решение, пока ваша проблема не будет решена.

Овации,
АХ


Рейтинг:
1

dom71_01

Я использовал первое решение, но чего я не нашел, так это как я могу вставить одну запись в datatable.
Вот пример моего кода:

... first query..
if (datareader.HasRows())
{
   while(datareader.Read())
   {
      query = ("SELECT field1, field2, field3 FROM table " +
         "WHERE field4 = '" + datareader[0].ToString() + "'");
      command.commandtext = query;
      sqlDataReader dataR = command.ExecuteReader();
      // NOW I'VE THE RECORD. THE METHOD TO INSERT IT INTO THE TABLE ??
      dataGridView1.DataSource = table;
   }
}

Надеюсь, я выразился достаточно ясно.
Спасибо.


Richard Deeming

Если вы хотите обновить свой вопрос, Нажмите зеленую ссылку "улучшить вопрос" и обновите свой вопрос.

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" кнопка под этим решением.

НЕ опубликуйте свое обновление или комментарий как новое "решение".

Richard Deeming

Кроме того, ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Richard Deeming

И наконец, вы почти наверняка можете достичь того, что пытаетесь сделать с помощью одного запроса, используя соединение. Если вы обновите свой вопрос с помощью примера обоих запросов, кто-то сможет показать вам, как это сделать.

dom71_01

Извините, это мой первый вопрос, и я использовал неправильный способ добавить комментарий.
Спасибо.

Рейтинг:
0

Member 12893295

Есть 2 способа сделать это
1)Когда вы получили объект sqldatareader, а затем прочитали этот объект, если у читателя есть данные, Вы делаете другой запрос на основе объекта reader, снова вы получили объект reader, который вам нужно создать объект Datarow и вставить значения объекта reader в datarow, а затем добавить datarow в datatable.окончательно назначить DataTable для сетки
2)Создайте 1 хранимую процедуру, в которой создайте один курсор.Соберите данные в курсор.Считайте курсор строка за строкой, затем напишите другой запрос с параметром строки курсора, соберите данные в переменную temp, а затем верните переменную temp.