2017-10-18 3 views
1

私はOLEDB接続を使用してExcelファイルからデータを読み取ります。 SelectクエリでIN演算子を使用しているときに問題に直面しています。以下 は私のクエリ、OLEDBの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); 

である私は、空の結果を取得していますが、私は単一の値のみを与えるならば、私は結果を取得しています。助けてください。

答えて

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

ある非常に異なるに:

where someval in (123,456,789) 

2行目には3つの数値に対してsomevalを試験します。最初の行はsomevalの単一文字列値に対してテストします。数字とカンマが含まれています(ただし、数値とカンマは無関係です)。

あなたは(の1つ)することなく、あなたがやりたいことはできません。

  • すなわちin (?,?,?,?)
  • は、分割を行うには、バックエンドのいくつかの機能を利用して、値ごとに一つのパラメータを持つように動的SQLを書くことを - 最近のバージョンのSQL ServerではSTRING_SPLITなどです(これは非常にバックエンド固有のものです)。そのような機能が存在するかどうかをアドバイスするExcelについては十分にわかりません。
3

これはよくある間違いです。
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 
     } 

    } 
} 
+0

何か:パラメータのプレースホルダを格納するためのリストを使用します(と私たちは基礎となるDBを知らないので、彼らがあるべき「?」 )多くの文字列操作の代わりにstring.Joinを使用して最終クエリを作成します(多くのパラメータを使用するとパフォーマンス上の問題になる可能性があります)。また、パラメータはOleDb.Int32型ですが、演算子は文字列を使用します。これはエンジンに依存しても動作しなくてもかまいません。適切なことをして変換してください。 – Steve

+0

@スティーブ[あなたの答えはこちら](https://stackoverflow.com/a/46471904/3094533)のような意味ですか?私は実際にそれについて考えましたが、それは盗作のようなものになると判断しました。それは誠実な形の賛美ですが、私はクレジットを支払うべきであると信じています:-) –

+0

あの場所です。たぶん、重複してこれを閉じるべきですが、不可能です。他の人が重複していることを確かめてください – Steve