循环内的SQL参数

时间:2014-07-03 18:38:05

标签: c# sql loops sqlparameters

我有一个列表,我正在拉出来插入数据库。这不会是一个Web应用程序,所以我刚刚做了如下:

string sqlStorage = (null,"asd"),

for (int i = 1; i < listsize; )
{

sqlStorage = sqlStorage + "(null,someVariableFromLoop)";

i++

}

string connString = "Server=localhost;...........";

MySqlConnection conn = new MySqlConnection(connString);
MySqlCommand command = conn.CreateCommand();
command.CommandText = @"INSERT INTO table1 VALUES " + tempSQLStorage;

etcetc...

然而

  

“someVariableFromLoop”

是大量的文本,其中包含各种可怕的代码破解字符。引号等等。

所以我查看参数(我应该做SQL的方式,我知道,我知道),但是我无法找到在循环中存储这些参数的方法。我不希望每次迭代都能击中数据库。

中的某些内容
  

“@变量” + i.toString();

但根本无法让它发挥作用。

那么有没有人知道如何存储参数和执行查询?提前谢谢!

2 个答案:

答案 0 :(得分:1)

所以我查看参数(我应该做SQL的方式,我知道,我知道),但是我无法找到在循环中存储这些参数的方法。我不希望每次迭代都能击中数据库。我走了一条路 &#34; @变量&#34 + i.toString(); 但根本无法让它发挥作用。

嗯,你收到的错误是什么?因为这就是你的方式。这是MSSQL的一个例子,我知道这项技术有效,因为我之前做过类似的事情:

int i = 0;
List<string> clauses = new List<string>() {"(@key0, @value0)"};
List<SqlParameter> paramList = new List<SqlParameter> {
    new SqlParameter("@key0", DBNull.Value), 
    new SqlParameter("@value0", "asd")
};
for (i = 1; i < listSize; i++) {
    clauses.Add("(@key" + i + ", @value" + i + ")");
    paramList.Add(new SqlParameter("@key" + i, someKey));
    paramList.Add(new SqlParameter("@value" + i, someValue);
}
SqlConnection conn = new SqlConnection(connString);
SqlCommand command = new SqlCommand(conn, @"INSERT INTO table1 VALUES " + String.Join(", ", clauses);
foreach(SqlParameter param in paramList) command.Parameters.Add(param);
command.ExecuteNonQuery();

注意,上面的代码很快而且很脏。显然,using语句和各种其他最佳实践也应该包含在生产代码中。

另请看这个:How do you use the MySql IN clause。它有一个动态创建参数并将参数传递给查询的示例,但是对于SELECT ... IN子句与INSERT ... VALUES。

答案 1 :(得分:0)

要确保安全代码(并避免格式错误的查询),请将SQL Command对象与Parameters配合使用。对每条记录执行一次命令没有什么可怕的错误 - 通过网络往返的额外开销有点小,但如果文本很长,你可能不得不这样做,因为查询确实有字符限制。