Добавьте параметры SQL внутри цикла, исключите за пределами цикла. (Multi-вставка одного запроса с параметрами в C # SQL Client) - PullRequest
5 голосов
/ 13 мая 2019

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

Это работало путем жесткого кодирования значений в запросе.строка, но мне нужно сделать это, используя «cmd.Parameters.AddValue() или cmd.Parameters.AddWithValue()», поскольку мне нужно предотвратить SQL-инъекцию.

Итак, мой код выглядит примерно так:

         string query = "insert into dbo.Foo (column1, column2, column3) values ";    
         SqlCommand cmd
            foreach (line in rowsArray) {
                cmd.Parameters.Clear();
                cmd = new SqlCommand(query, cnn); //So, the problem is this override
                query += "(@key1, @key2, @key3), ";

                cmd.Parameters.AddWithValue("@key1", line.value1);
                cmd.Parameters.AddWithValue("@key2", line.value2);
                cmd.Parameters.AddWithValue("@key3", line.value3);
            } 
         query = query.Substring(0, query.Length-2); //Last comma
         cmd.ExecuteNonQuery();
         cnn.Close();

Я хочу ExecuteNonQuery(); вне цикла, чтобы сделать только одну вставку.

Любые идеи?

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

1 Ответ

0 голосов
/ 13 мая 2019

Я, наконец, решил сделать два цикла, так как он работал лучше, чем ожидалось.

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

При таком подходе я заканчиваю строковый запрос и затем добавляю значения.Я даю ключи идентификаторов, чтобы в следующем цикле их можно было заменить значениями по порядку, используя тот же идентификатор.

            string query = "insert into dbo.Foo (column1, column2, column3) values ";    

            int id = 0;
            foreach (line in rowsArray) {
                query += "(@key1"+id+", @key2"+id+", @key3"+id+"), ";
                id++;
            }
            query = query.Substring(0, query.Length-2); //Last comma


            SqlCommand cmd = new SqlCommand(query, cnn);
            id = 0;
            foreach (line in rowsArray) {
                cmd.Parameters.AddWithValue("@key1"+id, line.value1);
                cmd.Parameters.AddWithValue("@key2"+id, line.value2);
                cmd.Parameters.AddWithValue("@key3"+id, line.value3);
            } 

            cmd.ExecuteNonQuery();
            cnn.Close();

Также отметим наличие SqlBulkCopy , что позволяетзагрузите DataTables и получите более чистый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...