带“ where in”和dbParameter的OleDbCommand

时间:2019-01-07 10:53:25

标签: c# sql ms-access oledbcommand

我尝试通过C#从访问数据库文件中的表中删除一些行。 这次尝试没有失败,没有错误,这使我得出结论:我有一个有效的查询,但数据不正确。

我试图查看是否可以通过代码中的select语句查询数据,并且可以将问题缩小为参数。

该语句应如下所示

SELECT * FROM tbIndex where pguid in ('4a651816-e15b-4c6a-85c4-74033ca6c423', '0add7bff-a22f-4238-9c7f-e1ff4ed3c7e2', '742fae8b-2692-4a6f-802c-848fad570696', '5e6b65de-2403-4800-a47d-e57c7bd8e0a6')

我尝试了两种不同的方式(dbCmd2和dbCmd3)*,第一个*(dbCmd2)*可以通过这种方式工作,但是由于注入问题,不是我偏爱的解决方案。

using (OleDbCommand dbCmd2 = new OleDbCommand { Connection = m_Connection })
{
    dbCmd2.CommandText = "SELECT * FROM tbIndex where pguid in ("+pguid+")";
    using (DbDataReader reader = dbCmd2.ExecuteReader())
    {
        List<object[]> readValuesFromIndex = new List<object[]>();
        while (reader.Read())
        {
            //Point reached
            object[] arr = new object[reader.VisibleFieldCount];
            reader.GetValues(arr);
            //...
        }
        reader.Close();
    }

    using (OleDbCommand dbCmd3 = new OleDbCommand { Connection = m_Connection })
    {
        dbCmd3.CommandText = "SELECT * FROM tbIndex where pguid in (@pguid)";
        dbCmd3.Parameters.Add("@pguid", OleDbType.VarChar).Value = pguid;
        using (DbDataReader reader = dbCmd3.ExecuteReader())
        {
            List<object[]> readValuesFromIndex = new List<object[]>();
            while (reader.Read())
            {
                //Point not reached
                object[] arr = new object[reader.VisibleFieldCount];
                reader.GetValues(arr);
                //...
            }
            reader.Close();
        }
    }

请注意,pguid设置为"'4a651816-e15b-4c6a-85c4-74033ca6c423', '0add7bff-a22f-4238-9c7f-e1ff4ed3c7e2', '742fae8b-2692-4a6f-802c-848fad570696', '5e6b65de-2403-4800-a47d-e57c7bd8e0a6'"

我一直认为第二个选项将简单地以安全的方式替换参数,但这显然不是这种情况。

我的问题是: 第二个选项为什么不返回任何值?

1 个答案:

答案 0 :(得分:2)

参数始终是单个值。

in子句需要多个值,以逗号分隔。

您可以执行以下操作来像单独的参数一样传递它们:

Type : Type