繁体   English   中英

OLEDB中的IN运算符

[英]IN Operator in OLEDB

我正在使用OLEDB连接从Excel文件读取数据。 在Select查询中使用IN运算符时遇到问题。 以下是我的查询,

string EmployeeIds = "'1231','1232','1233'";
SELECT [Employee Number],[Employee Name],[First In Time],[Last Out Time],[Total Work Hours] 
FROM [Sheet0$A2:J] 
WHERE  [Employee Number] IN (?);

 comm.Parameters.AddWithValue("?",EmployeeIds);

我得到的结果是空的,但是如果我只给出单个值,那么我就得到结果。 请帮忙。

where someval in ('123,456,789')

与以下内容有很大不同

where someval in (123,456,789)

第二行针对3个数值测试someval 第一行针对碰巧包含数字和逗号的单个字符串值测试someval (但这些数字和逗号无关)。

没有以下一项,您将无法做自己想做的事情:

  • 动态编写SQL以使每个值具有一个参数,即in (?,?,?,?)
  • 利用后端的某些功能进行拆分-例如在SQL Server的最新版本中使用STRING_SPLIT (这将非常特定于后端); 我对Excel的了解不足,无法建议这样的功能是否存在

这是一个非常常见的错误。
IN运算符需要一个值列表 ,但是您提供的一个值恰好包含一个列表。 您应该为EmployeeIds列表中的每个值创建一个不同的参数。

这是一种实现方法:

string EmployeeIds = "'1231','1232','1233'";
var values = EmployeeIds.Split(',');

using(var command = new OleDbCommand())
{
    var sql = "SELECT [Employee Number], [Employee Name], [First In Time], [Last Out Time], [Total Work Hours] "+
              "FROM [Sheet0$A2:J] "+
              "WHERE [Employee Number] IN (";

    for(int i=0; i < values.Length; i++) 
    {
        // Please note that string interpolation will work only with c# 6 or later.
        // If you are working with vs 2013 or earlier, use string.Format instead.
        sql = $"{sql} @{i},";
        command.Parameters.Add($"@{i}", OleDbType.Int).Value = values[i].Trim(new char[] {'}); // You don't need the ' anymore since you are working with parameters now...
    }

    command.CommandText = sql.TrimEnd(',') +");";
    command.Connection = con;
    using(var reader = Command.ExecuteReader())
    {
        while(reader.Read())
        {
            // do your stuff with the data
        }

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM