2017-10-20 11 views
3

SQLテーブルの特定のデータをDataTableにプルダウンする必要があるプロジェクトでクラスを拡張しています。以前は、データはすべてSQLのproc内で計算され、変更されましたが、計算されたデータが代わりに新しいテーブルに渡されるように、これを修正しました。さて、私は、このデータをID値に基づいてデータベースから取り出す方法を書いています。SQLテーブルのデータをパラメータに基づいてDataTableにプル

このコードの多くは、別の開発者によって書かれたもので、私はあまり知らないタプルのものを持っていて、ちょっと混乱させます。論理的には、似たようなことをやったことがありますが、特定の行だけではなく、テーブル全体を取り除いただけです。

これは、方法での私の最初のパスである:

new FooClass(_repo, dtRevisedData, idValue).Execute(); 
:最後に、このようなクラスを呼び出す前に

private readonly IDbRepository _repo; 
private readonly DataTable _revisedDatabTable; 
private List<Tuple<string, string>> _commandParameters; 
private readonly int _batchId; 

public FooClass(IDbRepository repository, DataTable revisedDatabTable, int batchId) //pass in structure 
    { 
     _repo = repository; 
     _revisedDatabTable = revisedDatabTable; 
     _batchId = batchId; 
    } 

    public void Execute() 
    { 

     _commandParameters = new List<Tuple<string, string>> 
     { 
      new Tuple<string, string>("@IDValue",_idValue.ToString()) 
     }; 


     _repo.ReadSqlTableToDataTable(_commandParameters, _revisedDatabTable); 
    } 

public DataTable ReadSqlTableToDataTable(List<Tuple<string, string>> parameterValueMappings, DataTable dt) 
    { 
     string query = "SELECT * FROM dbo.Mytable WHERE IdValue= "; 

     using (var conn = new SqlConnection(_config.ConnectionString)) 
     { 
      conn.Open(); 

      SqlCommand cmd = new SqlCommand(query + parameterValueMappings, conn); 


      using (var da = new SqlDataAdapter(cmd)) 
      { 
       da.SelectCommand.CommandTimeout = 600; 
       da.Fill(dt); 
      } 
     }       
     return dt; 
    } 

は、その後、私はそうのようなクラスにそれを使用

idValueはファイルを介して読み込まれ、新しいSQLテーブルにスローされます。

これを実行すると、何も戻ってこない。私のテーブルにはデータが入っているので、それは問題ではないことは分かっています。私はタプルをどのように使用しているかという問題があると感じています。私はそれを正しく設定しましたか?そうでなければ、私は間違って何をしていますか?

+0

はReadSqlTableToDataTableに休憩を入れて、あなたのクエリをチェック - イムそれはあなたがそれはあなたが「+」演算子を使用する場合、 'STRING'と'一覧<タプル<文字列で取得できると期待し何 – BugFinder

+0

をしてどのように考えるか読んdoesntの考え、 '' '' ''新しいSqlCommand(query + parameterValueMappings、conn); '? – Fabio

+0

@Fabio私は渡すSQL文を完成させるために整数値であると考えています。私のSQLクエリが不完全であるため – N0xus

答えて

2

あなたはSqlCommandを悪用しています。文字列を連結する代わりに、文字列としてqueryを指定し、SqlCommand.Parametersを使用してすべてのパラメータを渡す必要があります。 サンプルhereを参照してください。

あなたの場合は、このようにしてください。タプルも連結もありません。

0

なぜ値をカンマ区切りの文字列に分割し、=の代わりにINを使用しないのですか?

string allTuperValues = string.Join(",", parameterValueMappings.Select(t => 
string.Format("{0}", t.Item2))); 
string query = "SELECT * FROM dbo.Mytable WHERE IdValue IN(" + allTuperValues 
+ ")"; 
+1

最適な方法ではなく、悪いアドバイスが必要な場合は、常に 'SqlParameter'を使用してください。 SQLインジェクションから安全に保護し、問合せをより効果的に実行する(準拠した問合せ計画を再利用することにより) – Fabio

関連する問題