Vinodh Muthusamy Ответов: 3

Как использовать массовое обновление в C#


я разработал свой код с процессом обновления с использованием цикла foreach. Но мне нужно обработать эту операцию с помощью массовое обновление. Пожалуйста, решите этот код.

обновление Datatable содержит

ID       Type ID   status    Mismatchvalues    Integration
1          12                           
2          14

Столбец Datatable содержит

Integration      Mismatchvalues      status    ID Type ID
test               15               active     1   12
test1              14               active     2   14

foreach (DataRow items in Update.Rows)
               {

                   foreach (DataRow item in column.Rows)
                   {

                       if ((items.ItemArray[0].ToString().Trim() == item.ItemArray[3].ToString().Trim()) && (items.ItemArray[1].ToString().Trim() == item.ItemArray[4].ToString().Trim()))
                       {
                           Utility.SQLUtility.ExecuteNonQuery(strConnectionOrgconnname, @"update [Test]
                    set  status ='" + item.ItemArray[2].ToString().Trim() + "' , Mismatchvalues ='" + item.ItemArray[1].ToString().Trim() + "',Integration ='" + item.ItemArray[0].ToString().Replace("'", "''").Trim() + "' where [ID] ='" + items.ItemArray[0].ToString().Trim() + "' and [ID]='" + items.ItemArray[1].ToString().Trim() + "'");

                       }
                   }
               }


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

foreach (DataRow items in Update.Rows)
                {

                    foreach (DataRow item in column.Rows)
                    {

                        if ((items.ItemArray[0].ToString().Trim() == item.ItemArray[3].ToString().Trim()) && (items.ItemArray[1].ToString().Trim() == item.ItemArray[4].ToString().Trim()))
                        {
                            Utility.SQLUtility.ExecuteNonQuery(strConnectionOrgconnname, @"update [Test]
                     set  status ='" + item.ItemArray[2].ToString().Trim() + "' , _Mismatchvalues ='" + item.ItemArray[1].ToString().Trim() + "',Integration ='" + item.ItemArray[0].ToString().Replace("'", "''").Trim() + "' where [ID] ='" + items.ItemArray[0].ToString().Trim() + "' and [ID]='" + items.ItemArray[1].ToString().Trim() + "'");

                        }
                    }
                }

3 Ответов

Рейтинг:
1

Patrice T

Utility.SQLUtility.ExecuteNonQuery(strConnectionOrgconnname, @"update [Test]
                     set  status ='" + item.ItemArray[2].ToString().Trim() + "' , _Mismatchvalues ='" + item.ItemArray[1].ToString().Trim() + "',Integration ='" + item.ItemArray[0].ToString().Replace("'", "''").Trim() + "' where [ID] ='" + items.ItemArray[0].ToString().Trim() + "' and [ID]='" + items.ItemArray[1].ToString().Trim() + "'");

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
1

Alek Massey

Вместо того чтобы использовать циклы foreach для передачи каждой отдельной команды обновления SQL в метод ExecuteNonQuery по отдельности,
используйте их для построения строки, которая по завершении будет содержать все команды обновления. Передача этой строки в ExecuteNonQuery вне foreaches (если строка не является нулевой).


MadMyche

SQL-инъекция. Текущий метод OP-построение строк для своих команд-это хрестоматийный пример того, чего не следует делать. Боюсь, от этого будет только хуже.

Рейтинг:
0

MadMyche

Ваш текущий метод подвержен риску внедрения SQL; вы никогда не должны создавать текст команды SQL с помощью встроенных переменных. Рекомендуется использовать параметризованный запрос.

Одной из функций, добавленных в SQL 2008, была возможность использовать табличное значение Параметр. Это позволит вам передать всю вашу DataTable в качестве параметра хранимой процедуре.

В данный момент у меня нет времени, чтобы пройти через все это и сделать все это для вас; но я могу предоставить ссылку на MS, которая содержит информацию и образцы о том, как вы можете сделать это сами.

Возвращающие табличное значение параметры | прохождение возвращающего табличное значение параметра в хранимую процедуру[^]