2011-10-18 2 views
1

私は、データセットをクエリするために使用しているデザイナ生成コードをいくつか持っています。デザイナーは、独自のBindingSouceとTableAdapterを作成したReportViewerを持つFormを持っているため、このデザイナーがそれを生成しました。私はTableAdapterスマートタグで "Add Query ..."関数を使用しました。パラメータ数が可変のparamatarizedクエリの生成

クエリは単純なSELECTコマンドです。それは見つけることができますが、私は一度に複数のレコードを照会することがあります(私はバーコードのリストに基づいてレポートを生成しています。設計者は、私にこのコードを与えた:

public virtual int FillBySampleID(dbReceivedSamplersDataSetAccess.tblReceivedSamplersDataTable dataTable, string Param1) { 
     //FYI the select command it used is "SELECT * FROM tblReceivedSamplers WHERE SampleID IN (?)" 
     this.Adapter.SelectCommand = this.CommandCollection[2]; 
     if ((Param1 == null)) { 
      throw new global::System.ArgumentNullException("Param1"); 
     } 
     else { 
      this.Adapter.SelectCommand.Parameters[0].Value = ((string)(Param1)); 
     } 
     if ((this.ClearBeforeFill == true)) { 
      dataTable.Clear(); 
     } 
     int returnValue = this.Adapter.Fill(dataTable); 
     return returnValue; 
    } 

をそして、それは動作しますので、私は、このメソッドをオーバーロードし、私は一度WHEREを使用しての任意の数のパラメータを渡すことができるようにするには、このコードを作成した単一のレコードに適しています... IN SQLステートメント。

public virtual int FillBySampleID(dbReceivedSamplersDataSetAccess.tblReceivedSamplersDataTable dataTable, string[] Params) 
    { 
     //this.Adapter.SelectCommand = this.CommandCollection[2]; 
     if ((Params == null)) 
     { 
      throw new global::System.ArgumentNullException("Param1"); 
     } 
     else 
     { 
      int numParams = Params.Length; 


      List<string> lstParamQuesMarks = Enumerable.Repeat("'?'", numParams).ToList(); 
      string strParamQuesMarks = String.Join(",", lstParamQuesMarks); 
      this.Adapter.SelectCommand.CommandText = "SELECT * FROM tblReceivedSamplers WHERE SampleID IN (" + strParamQuesMarks + ")"; 

      this.Adapter.SelectCommand.Parameters.Clear(); 
      for (int i = 0; i < numParams; i++) 
      { 
       this.Adapter.SelectCommand.Parameters.AddWithValue("Param"+i, Params[i]); 
      } 

     } 
     if ((this.ClearBeforeFill == true)) 
     { 
      dataTable.Clear(); 
     } 
     int returnValue = this.Adapter.Fill(dataTable); 
     return returnValue; 
    } 

私は賢いと思っていましたが、動作していないようです。それはエラーや何かを与えることはありません。 SelectCommandのテキストがSELECT * FROM tblReceivedSamplers WHERE SampleID IN ('?','?','?','?')になりました.4つのパラメータを渡して、すべてのパラメータの値が良好に見える場合に発生します。デバッグ中にdataTableを見て、countプロパティを参照すると、デザイナで生成されたコードが1に設定されているのとは異なり、0に設定されます。

私のデータベースはOleDbです。

私は何をしようとしていますか?

答えて

2

パラメータは引用符で囲むべきではありません。 '?'ではなく、?を使用してください。

+0

すごい目!それはそれだった。愚かな私。 – Brad

関連する問題