c#在循环中更改sql的参数

时间:2017-05-31 11:54:33

标签: c# mysql parameter-passing

我想在循环中重用参数化查询。

(这个查询是一个简单的例子,我不认为我可以在sql中创建循环并只返回所需的行)

而不是

private String sql = "SELECT v FROM t WHERE VAL_1 = @param_1";
for (int n=1;n<10;n++)
{
    MySqlCommand m = new MySqlCommand(sql);
    m.Parameters.AddWithValue("@param_1", n);
    res = Convert.ToInt32(m.ExecuteScalar());
    ( ... )
}

我想在循环外部移动查询的设置;

之类的东西
private String sql = "SELECT v FROM t WHERE VAL_1 = @param_1";
MySqlCommand m = new MySqlCommand(sql);
m.Parameters.Add("@param_1");  // does not exist
for (int n=1;n<10;n++)
{
    m.Parameters.Set("@param_1", n); // does not exist
    res = Convert.ToInt32(m.ExecuteScalar());
    ( ... )
}

因此服务器不必为循环中的每个ilteration解析相同的sql。

这可能吗?

4 个答案:

答案 0 :(得分:3)

您可以使用

添加参数
m.Parameters.Add("@param_1", MySqlDbType.Int32);

以及稍后在循环中使用

分配值
m.Parameters["@param_1"].Value = n;

答案 1 :(得分:0)

是的,这应该是可能的!查看SQL Prepared Statements!

你可以使用:

cmd = new MySqlCommand("SELECT * FROM yourTable WHERE condition=@val1", MySqlConn.conn);

在循环中添加参数并准备命令

cmd.Parameters.AddWithValue("@val1", value);
cmd.Prepare();

循环后用

执行查询
cmd.ExecuteNonQuery();

答案 2 :(得分:0)

如果您只需要对parms列表运行查询而不对每个结果执行不同的操作,您可以使用类似的循环创建一个字符串:

String  where_str= VAL_1 = @param_1" OR VAL_1 = @param_2" OR VAL_1 = @param_3"...

String sql = "SELECT v FROM t WHERE " + where_str;

然后执行查询,它将给出相同的结果。

如果您需要对结果进行saparate,那么可以使用prepaerd statement进行调整。另外,我建议你阅读stored procedure在某些情况下,它可能是你最好的灵魂。

预付费声明的示例:(链接中的更多信息)

private static void SqlCommandPrepareEx(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand(null, connection);

        // Create and prepare an SQL statement.
        command.CommandText =
            "INSERT INTO Region (RegionID, RegionDescription) " +
            "VALUES (@id, @desc)";
        SqlParameter idParam = new SqlParameter("@id", SqlDbType.Int, 0);
        SqlParameter descParam = 
            new SqlParameter("@desc", SqlDbType.Text, 100);
        idParam.Value = 20;
        descParam.Value = "First Region";
        command.Parameters.Add(idParam);
        command.Parameters.Add(descParam);

        // Call Prepare after setting the Commandtext and Parameters.
        command.Prepare();
        command.ExecuteNonQuery();

        // Change parameter values and call ExecuteNonQuery.
        command.Parameters[0].Value = 21;
        command.Parameters[1].Value = "Second Region";
        command.ExecuteNonQuery();
    }
}

答案 3 :(得分:-1)

是的,你可以做所有这些事情,但除非这只是一个例子,你想要将IN与所有值一起使用,或者如果存在大量的临时表,则加入到批量加载的临时表中。原因是DB的每次往返都有很大的开销,您可以使用这些技术从n减少到1。