在循环内添加SQL参数,在循环外执行。 (在C#SQL Client中使用参数进行单查询多插入)

时间:2019-05-13 07:16:13

标签: c# sql sql-server sqlclient

因此,要进行多行插入查询,我需要在具有值的循环内将键替换为值。

它通过将值硬编码到查询字符串中来工作,但是我需要使用“ 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();只插入一个。

有什么想法吗?

我考虑过创建一个循环,在循环中我将字符串中的键添加一个标识符,然后将所有键替换为具有相同id的另一个循环,但我认为这样做不是非常有效或很好的做法。

1 个答案:

答案 0 :(得分:0)

我最终决定做两个循环,因为它比预期的要好。

  

我考虑过做一个循环,在循环中我用一个标识符添加字符串中的键,然后用相同的ID替换所有的键,以迭代另一个循环,但我认为这样做不是非常有效或很好的做法。

使用这种方法,我完成了字符串查询,然后添加了值。我提供了密钥ID,以便可以在下一个使用相同ID的循环中按顺序将它们替换为值。

            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并生成更简洁的代码。