简体   繁体   English

OLEDB中的IN运算符

[英]IN Operator in OLEDB

I am using OLEDB connection to read data from excel files. 我正在使用OLEDB连接从Excel文件读取数据。 I am facing issues while using IN operator in the Select query. 在Select查询中使用IN运算符时遇到问题。 Below is my query, 以下是我的查询,

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);

I am getting empty results but if I give only single value then I am getting result. 我得到的结果是空的,但是如果我只给出单个值,那么我就得到结果。 Please help. 请帮忙。

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

is very different to: 与以下内容有很大不同

where someval in (123,456,789)

The second line tests someval against 3 numeric values; 第二行针对3个数值测试someval the first line tests someval against a single string value that happens to contain numbers and commas (but those numbers and commas are irrelevant). 第一行针对碰巧包含数字和逗号的单个字符串值测试someval (但这些数字和逗号无关)。

You cannot do what you want without (one of): 没有以下一项,您将无法做自己想做的事情:

  • writing the SQL dynamically to have one parameter per value, ie in (?,?,?,?) 动态编写SQL以使每个值具有一个参数,即in (?,?,?,?)
  • making use of some feature of the backend to do the split - for example STRING_SPLIT in recent versions of SQL Server (this will be very backend specific); 利用后端的某些功能进行拆分-例如在SQL Server的最新版本中使用STRING_SPLIT (这将非常特定于后端); I do not know enough about Excel to advise on whether such a feature exists 我对Excel的了解不足,无法建议这样的功能是否存在

This is a very common mistake. 这是一个非常常见的错误。
The IN operator expect a list of values , but you are supplying a single value that happens to contain a list. IN运算符需要一个值列表 ,但是您提供的一个值恰好包含一个列表。 You should create a different parameter for each value in the EmployeeIds list. 您应该为EmployeeIds列表中的每个值创建一个不同的参数。

Here is one way to do it: 这是一种实现方法:

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.

相关问题 数据绑定oledb异常查询中缺少运算符 - databinding oledb exception missing operator in the query 查询表达式Oledb INSERT语句中的语法错误(缺少运算符) - Syntax error (missing operator) in query expression, Oledb INSERT Statement C#OleDb select查询抛出缺少的运算符异常 - C# OleDb select query throws missing operator exception 查询表达式,Oledb UPDATE语句中的语法错误(缺少运算符) - Syntax error (missing operator) in query expression, Oledb UPDATE Statement 消息:System.Data.OleDb.OleDbException:查询表达式中的语法错误(缺少运算符) - Message: System.Data.OleDb.OleDbException : Syntax error (missing operator) in query expression C# 中的 SQL 查询(System.Data.OleDb.OleDbException:&#39;查询表达式中的语法错误(缺少运算符)) - SQL query in C# (System.Data.OleDb.OleDbException: 'Syntax error (missing operator) in query expression) 错误:System.Data.OleDb.OleDbException (0x80040E14):查询表达式中的语法错误(缺少运算符) - Error: System.Data.OleDb.OleDbException (0x80040E14): Syntax error (missing operator) in query expression System.Data.OleDb.OleDbException (0x80040E14):查询表达式中的语法错误(缺少运算符)电子邮件 = '12' 和密码 '12'' - System.Data.OleDb.OleDbException (0x80040E14): Syntax error (missing operator) in query expression 'Email= '12' and Password '12'' OleDB参数 - OleDB Parameters 未实现OleDb - OleDb not implemented
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM