在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 } } }