簡體   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