循环中的SQL参数

本文关键字:参数 SQL 循环 | 更新日期: 2023-09-27 18:11:25

我有一个列表,我拔出的东西插入到数据库中。这不是一个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的方式,我知道,我知道),但是我无法找到一种方法来存储这些参数在循环内。我不想每次迭代都去访问数据库。我试着写了一些

之类的东西

" @variable " + i.toString ();

却无法让它工作。

所以有人知道我将如何去存储参数和执行查询吗?提前感谢!

循环中的SQL参数

所以我看了看参数(我应该做SQL的方式,我知道,我知道),但是我无法找到一种方法来存储这些参数在循环内。我不想每次迭代都去访问数据库。我尝试了一些类似于"@variable"+ 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语句和各种其他最佳实践也应该纳入生产代码。

也看看这个:你如何使用MySql的IN子句。它有一个动态创建和传递参数到查询的示例,但是对于SELECT…IN子句vs. INSERT…值。

为确保代码安全(并避免格式错误的查询),请使用带参数的SQL Command对象。对每条记录执行一次命令并没有什么可怕的错误——只是在网络上往返时会有一点额外的开销,但是如果文本很长,您可能无论如何都必须这样做,因为查询确实有字符限制。