c#参数化查询无法识别

时间:2017-12-30 16:13:03

标签: c# sybase-ase parameterized-query

我有一个查询,预计会返回几行,但不会在代码中返回任何结果。我有一些arraylist的价值,我用单引号和逗号包围在' in'操作

我在这里做错了吗?

AseCommand cmd = new AseCommand("select * from Customer where ID in (@parmCustId)", conn);
cmd.Parameters.AddWithValue("@parmCustId", string.Join(",", arrList.Cast<string>().Select(x => string.Format("'{0}'", x))));
using (AseDataReader dr = cmd.ExecuteReader())
{
   if (dr.HasRows)
   {
      //do something
   }
}

2 个答案:

答案 0 :(得分:0)

在这种情况下,你必须做的事情真的很愚蠢。您必须为IN列表中的每个值添加一个参数。

所以你的查询最终会是这样的:

SELECT * FROM Customer WHERE ID in (@parmCustId1, @parmCustId2, @parmCustId3 ... @parmCustId<N>)

然后你的代码看起来像这样:

var query = "select * from Customer where ID in (@parmCustId)";
using (AseCommand cmd = new AseCommand("", conn))
{
    var replacement = "";
    for (int i = 0; i < arrList.Length; i++)
    {
        var id = arrList[i];
        var p = "@parmCustId" + i.ToString();
        cmd.Parameters.AddWithValue(p, id);
        replacement += p;
        if (i != arrList.Length - 1)
        {
            replacement += ",";
        }
    }

    cmd.CommandText = query.Replace("@parmCustId", replacement);
    using (AseDataReader dr = cmd.ExecuteReader())
    {
        if (dr.HasRows)
        {
            //do something
        }
    }
}

还有一些图书馆会支持这一点。例如,由StackOverflow的人员编写的Dapper将轻松地支持这一点。它还是一个超快速高效的对象关系映射器(ORM),如果您将一些DataReader逻辑放入一个对象中,它可以使一些DataReader逻辑更简单。你可以在NuGet上获得它。

答案 1 :(得分:0)

这是你想要跑的地方:

SELECT * FROM table WHERE ID IN(1,2,3,4)

这是你实际运行的内容:

SELECT * FROM table WHERE ID IN ('1,2,3,4')

如果你想参数化IN,你必须输入N个参数,并给每个参数赋值:

SELECT * FROM table WHERE ID IN (@p1, @p2, @p3, @p4)

//c# code here to populate 4 named parameters with an id each