在OLEDB中的IN运算符

我正在使用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) 

第二行测试someval对3个数值; 第一行测试someval对一个恰好包含数字和逗号的字符串值 (但这些数字和逗号是无关紧要的)。

没有(一个)你不能做你想做的事:

  • 动态编写SQL以使每个值有一个参数,即in (?,?,?,?)
  • 利用后端的某些function来进行拆分 – 例如SQL Server的最新版本中的STRING_SPLIT (这将是特定于后端的); 我不太了解Excel是否存在此类function的建议

这是一个非常常见的错误。
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 } } }