我想在循环中重用参数化查询。
(这个查询是一个简单的例子,我不认为我可以在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。
这可能吗?
答案 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。