Member 14626494 Ответов: 2

Как я могу получить каждую строку из базы данных и добавить ее в таблицу


string qamm = "Guide,Transport";
         ArrayList list2 = new ArrayList();
         for (int k = 0; k < qamm.Split(',').Length; k++)
         {
             string rooo = "";
             rooo = qamm.Split(',')[k];

             list2.Add(rooo);
         }



         d123.CONNECTER();
         for (int e =0;e<list2.Count;e++) {

         d123.dap = new SqlDataAdapter("select * from  whats_included where Title_of_whats_in =" + "'" + list2[e].ToString() + "'", d123.con);
         d123.dap.Fill(d123.dt);


         }

         d123.DECONNECTER();


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

он просто возвращает первую строку из базы данных

2 Ответов

Рейтинг:
7

phil.o

Первая часть: есть гораздо более простой способ:

string qamm = "Guide,Transport";
var list = new List<string>(qamm.Split(','));

Только две строчки, и то Split() метод вызывается только один раз.
Как правило, вы не хотите вызывать этот метод в цикле, когда вы можете сделать это только один раз и сохранить его результат в переменной.

Вторая часть: мне трудно понять, что вы хотите получить здесь. Содержимое объекта DataTable будут заменены на каждый последующий звонок Fill Кроме того, вы не должны создавать SQL-запросы путем объединения строк, поскольку вы оставляете свое приложение открытым для атак SQL-инъекций. Вместо этого лучше использовать параметризованные запросы. Вы также должны избегать SELECT * как можно больше, но достаточно четко укажите столбцы, которые вы хотите. Кроме того, вы должны дать переменным некоторые значимые имена и оставаться согласованными с корпусом имен методов. Вы также должны использовать одноразовые объекты (соединения, команды) в using блоки, чтобы правильно освободить ресурсоемкие объекты, когда они вам больше не нужны.
d123.CONNECTER();
using (SqlCommand cmd = new SqlCommand())
{
   cmd.Connection = d123.con;
   // Build command string
   var builder = new StringBuilder("SELECT * FROM whats_included WHERE Title_of_whats_in IN (");
   for (int i = 0; i < list.Count; ++i)
   {
      builder.Append($"@cat{i},");
   }
   builder.Remove(builder.Length - 1, 1); //Remove the last comma
   builder.Append(")");
   cmd.CommandText = builder.ToString();
   // Add parameters
   for (int i = 0; i < list.Count; ++i)
   {
      cmd.Parameters.Add($"@cat{i}", SqlDbType.NVarChar).Value = list[i];
   }
   // Create the adapter using prepared command
   d123.dap = new SqlDataAdapter(cmd);
   // Fill the table
   d123.dap.Fill(d123.dt);
}
d123.DECONNECTER();

Этот код должен заполнить вашу таблицу строками отфильтрованными по значениям в оригинале qamm строка.


phil.o

Пожалуйста. Это уже код C#.

MadMyche

+5

Maciej Los

5ed!

Рейтинг:
1

MadMyche

Первое, что я вижу в вашем коде, - это Уязвимость SQL-инъекции
! NEVER EVER ! если вы создадите запрос, объединяющий команды и переменные вместе.

Правильный способ сделать этот раздел кода-это использовать Параметр Sql[^]

Это приблизительная версия того, как это могло бы выглядеть, просто простое добавление 1 строки внутри этого блока.

d123.dap = new SqlDataAdapter("SELECT * FROM whats_included WHERE Title_of_whats_in = @title", d123.con);
d123.dap.SelectCommand.Parameters.AddWithValue("@title", list2[e].ToString());
d123.dap.Fill(d123.dt);
Ссылка:
Класс SqlParameter (System.Data.SqlClient) | Microsoft Docs[^]


Что касается проблемы, которую вы испытываете; не видя данных, которые поступают в таблицу или в таблице, трудно точно определить.
То, что я бы рекомендовал, было бы установить Точка прерывания на этом методе и запустите приложение в Отлаживать режим, чтобы вы могли видеть, какие значения входят в эту команду.


Maciej Los

5ed!