【发布时间】:2019-09-30 02:55:07
【问题描述】:
所以,想要进行多行插入查询,我需要用我拥有值的循环内的值替换键。
它通过将值硬编码到查询字符串中来工作,但我需要使用“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, 2, 3重复。 -
我可能只是创建一个事务,使用多个
ExecuteNonQuery调用,然后在最后提交事务。可能有更好的方法,但我至少希望它能奏效。否则,您需要在 SQL 中创建多个插入语句,并使用唯一命名的参数。 -
@JonSkeet 但是Execute方法每次调用都会攻击数据库吗?
-
如果你喜欢,可以使用
SqlBulkCopy进行批量插入,使用这个链接:stackoverflow.com/questions/3913371/sqlbulkcopy-from-a-list -
SQL Server 可以有效处理的查询长度有限制,
VALUES子句的硬限制为 1000 行,并且像这样的语句(具有许多不同的参数计数)会污染计划缓存。通常这种方法是不值得的;使用多语句事务、表值参数或SqlBulkCopy类。 (和don't useAddWithValue)。
标签: c# sql sql-server sqlclient