[英]Access parametrized IN() query
我正在尝试运行此查询:
SELECT * FROM Tabela1 WHERE Pole1 IN (@parameter)
当出现“选择值”的窗口时,我输入:“10, 50”,我收到 0 行(应该是 2)。
当我只输入“10”或“50”时,它会工作并为每个查询返回 1 行。
我正在使用 Access 2013 - 我做错了什么?
using (DbConnection connection = new T())
{
connection.ConnectionString = query.DatabaseConnection.ConnectionString;
using (DbCommand command = connection.CreateCommand())
{
command.CommandText = query.QuerySql.Sql;
command.CommandType = CommandType.Text;
command.CommandTimeout = query.QuerySql.CommandTimeout;
if (query.QuerySql.Parameters != null)
{
foreach (var parameter in query.QuerySql.Parameters)
{
var commandParameter = command.CreateParameter();
commandParameter.ParameterName = $"@{parameter.Name}";
commandParameter.Value = parameter.Value;
command.Parameters.Add(commandParameter);
}
}
我创建这样的查询:
QuerySql sql = new QuerySql("SELECT * FROM Tabela1 WHERE Pole1 IN(@parameter)", new List<ISqlParameter>()
{
new SqlMultiNumberParameter("parameter", new List<string>() { "10", "50" }, "Test parameter")
});
parameter.Value 返回这样的字符串:“10, 50”
此致
迈克尔
您不能使用单个参数来表示要传递给 IN 子句的值列表。 有一些 ORM(例如 Dapper)允许您传递值列表并为您构建正确的 IN 子句。
如果你想做同样的事情,你需要这样的方法
public OleDbCommand GetPoles(List<int> polesID)
{
// Base text of the query
string cmdText = @"SELECT * FROM TABLE1 WHERE Pole1 IN(";
// where we store the 'name' of the parameters. (OleDb doesn't care)
List<string> inClause = new List<string>();
// where we store the parameters and their values
List<OleDbParameter> parameters = new List<OleDbParameter>();
foreach(int id in polesID)
{
// Add a placeholder for the parameter
inClause.Add("?");
// Build the parameter and store it away
OleDbParameter p = new OleDbParameter("p" + id.ToString(), OleDbType.Integer);
p.Value = id;
parameters.Add(p);
}
OleDbCommand cmd = new OleDbCommand();
// Build the command text: IN(?,?,?). A ? placeholder for each parameter
cmd.CommandText = cmdText + string.Join(",", inClause.ToArray()) + ")";
// pass all the parameters to the command and return it
cmd.Parameters.AddRange(parameters.ToArray());
return cmd;
}
现在你只需要设置连接就可以执行命令了
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.