首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OleDbCommand与“where in”和dbParameter

OleDbCommand与“where in”和dbParameter
EN

Stack Overflow用户
提问于 2019-01-07 10:53:24
回答 1查看 137关注 0票数 0

我试图通过C#从access数据库文件中的表中删除一些行。这一尝试失败,没有错误,这导致我得出结论,我有一个有效的查询与不正确的数据。

我试着看看是否可以使用代码中的select语句查询数据,并将问题缩小到参数上。

该语句应如下所示

代码语言:javascript
复制
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)*工作,但由于注入问题,不是我喜欢的解决方案。

代码语言:javascript
复制
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'"__。

我一直认为第二个选项可以简单地以安全的方式替换参数,但情况显然并非如此。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-07 11:10:57

参数始终是单个值。

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

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

代码语言:javascript
复制
string[] guids = pguid.Split(',');
string sqlin = "";
int paramno = -1;
foreach (var guid in guids)
{
   parametercount ++;
   sqlin = sqlin + "@Param" + (string)parametercount; + ","
}
dbCmd3.CommandText = "SELECT * FROM tbIndex where pguid in (" + sqlin.Substring(0, sqlin.Length-1) + ")";
for(int i = 0; i <= parametercount; i++){
    dbCmd3.Parameters.Add("@Param" + (string)i, OleDbType.VarChar).Value = guids[i].Replace("'", "");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54072965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档