具有未知数量值的ODBC参数化查询?

时间:2017-09-28 14:29:22

标签: c# database odbc

我想从数据库中选择几个值( ODBC数据源)。表格很简单:

| name | value |
+------+-------+
| abcd | 12345 |

我想要选择名称为name1name2name3的值:

SELECT name, value FROM my_table WHERE name="name1" OR name="name2" OR name="name3"

现在我可以生成这个命令:

public string MakeCommand(List<string> names) {
    string command = "SELECT name, value FROM my_table WHERE ";
    bool first = true;
    foreach(string name in names) {
        if(first)
            first = false;
        else
            command+=" OR ";
        command+="name=\""+name+"\"";
    }
}

我希望没有必要强调这是访问数据库的非常糟糕的方式。

那么如何将这个参数化的ODBC命令设为described here

2 个答案:

答案 0 :(得分:1)

这个问题没有优雅的解决方案。您可以使用IN子句,但仍然需要逐个构建参数。因此,您可以返回使用您的名称列表所需的所有参数准备的OdbcCommand,而不是返回字符串。只需添加连接并执行(或传递连接并在此处准备一切)

public OdbcCommand MakeCommand(List<string> names, OdbcConnection con) {
    List<OdbcParameter> parameters = new List<OdbcParameter>();
    List<string> placeholders = new List<string>();
    foreach(string name in names) {
        OdbcParameter p = new OdbcParameter("?", OdbcType.NVarChar);
        p.Value = name;
        parameters.Add(p);
        placeholders.Add("?")
    }
    string command = "SELECT name, value FROM my_table WHERE name IN(";
    command = command + string.Join(",", placeholders.ToArray()) + ")";
    OdbcCommand cmd = new OdbcCommand();
    cmd.CommandText = command;
    cmd.Connection = con;
    cmd.Parameters.AddRange(parameters.ToArray());
    return cmd;
}

如果您仍有问题,那么它可能是与参数DataType相关联的东西。 NVarChar,VarChar,Text,String。某些数据库可能会对此类型做出不同反应您正在测试此代码的数据库是什么?

答案 1 :(得分:1)

嗯,最简单的解决方案可能是将参数连接到列表中每个值的sql,然后将此值作为参数添加到OdbcCommand中。

using(var command = new OdbcCommand())
{
    string sql = "SELECT name, value FROM my_table WHERE name IN(";

    for(int i=0; i < names.Count; i++) {
        sql = $"{sql} @{i},";
        command.Parameters.Add($"@{i}", OdbcType.VarChar).Value = names[i];
    }

    command.CommandText = sql.TrimEnd(",") +");";
    command.Connection = con;
    // fill a data set or execute a data reader here....
}