2016-10-31 5 views
1

IEnumerableを使用してデータを返すときに、指定したフィールド名でデータを参照して返したいメソッドを呼び出しています。IEnumerable <IDataRecord>を使用してデータを返す

例、ここでの機能は

public IEnumerable<IDataRecord> GetSomeData(string fields, string table, string where = null, int count = 0) 
    { 
     string sql = "SELECT @Fields FROM @Table WHERE @Where"; 

     using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug))) 
     using (SqlCommand cmd = new SqlCommand(sql, cn)) 
     { 
      cmd.Parameters.Add("@Fields", SqlDbType.NVarChar, 255).Value = where; 

      cn.Open(); 

      using (IDataReader rdr = cmd.ExecuteReader()) 
      { 
       while (rdr.Read()) 
       { 
        yield return (IDataRecord)rdr; 
       } 
      } 
     } 
    } 

で通話:

IEnumerable<IDataRecord> data = bw.GetSomeData("StaffCode, Perms", "BW_Staff", "StaffCode = 'KAA'"); 

私はデータをこの方法やどのような方法を返すために何をしなければなりませんか?

string staffCode = data["StaffCode"].ToString(); 
string perms = data["Perms"].ToString(); 

任意のヘルプ

+0

「フィールド」の以前のバージョンで実装

更新3

GetSomeDataいずれかの文字列の配列または区切り文字に分割されて区切られた文字列である必要があります。そのフィールドの配列をループして、cmd.Parameters.Add行を構築します。 –

答えて

1

ためのおかげで、あなたのデータ変数は、行のコレクションです。それぞれの行で面白いことをするには、コレクションを繰り返し処理する必要があります。

foreach (var row in data) 
{ 
    string staffCode = row["StaffCode"].ToString(); 
    string perms = row["Perms"].ToString(); 
} 

更新:

あなただけGetSomeData(...)は、単一の行を返すことを期待するあなたのコメントに基づいて、私は1 2のものをお勧めしたいです。

IDataRecordを返すようにGetSomeDataのシグネチャを変更します。実装から「yield」を削除します。

public IDataRecord GetSomeData(string fields, string table, string where = null, int count = 0) 
    { 
     string sql = "SELECT @Fields FROM @Table WHERE @Where"; 

     using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug))) 
     using (SqlCommand cmd = new SqlCommand(sql, cn)) 
     { 
      cmd.Parameters.Add("@Fields", SqlDbType.NVarChar, 255).Value = where; 

      cn.Open(); 

      using (IDataReader rdr = cmd.ExecuteReader()) 
      { 
       while (rdr.Read()) 
       { 
        return (IDataRecord)rdr; 
       } 
      } 
     } 
    } 
} 

それとも

var row = data.FirstOrDefault(); 
if (row != null) 
{ 
    string staffCode = row["StaffCode"].ToString(); 
    string perms = row["Perms"].ToString(); 
} 

備考:

GetSomeDataの実装が不完全です。あなたはいくつかのパラメータ、最も重要なのはfieldsパラメータを使用していません。概念的には、SQLではどのフィールドが返されるか、どのテーブルが使用されるかなどをパラメータ化することはできませんが、動的クエリを作成して実行する必要があります。ここで

アップデート2

は(C#6で、以前のバージョンでは、それが必要な場合は私に知らせて)適切なクエリを構築GetSomeDataの実装です。

public IEnumerable<IDataRecord> GetSomeData(IEnumerable<string> fields, string table, string where = null, int count = 0) 
{ 
    var predicate = string.IsNullOrWhiteSpace(where) ? "" : " WHERE " + where; 
    string sql = $"SELECT { string.Join(",", fields) } FROM {table} {predicate}"; 

    using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug))) 
    using (SqlCommand cmd = new SqlCommand(sql, cn)) 
    { 
     cn.Open(); 

     using (IDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       yield return (IDataRecord)rdr; 
      } 
     } 
    } 
} 

これはどのように使用するかです。

IEnumerable<IDataRecord> data = bw.GetSomeData(new[] { "StaffCode", "Perms" }, "BW_Staff", "StaffCode = 'KAA'"); 

あなたはそれを列挙するか、または.FirstOrDefaultを呼び出すことができます。それはあなたの選択です。 GetSomeDataを呼び出すたびに、クエリが実行されます。 C#

public IEnumerable<IDataRecord> GetSomeData(IEnumerable<string> fields, string table, string where = null, int count = 0) 
{ 
    var predicate = string.IsNullOrEmpty(where) ? "" : " WHERE " + where; 
    string sql = string.Format("SELECT {0} FROM {1} {2}", string.Join(",", fields), table, predicate); 

    using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug))) 
    using (SqlCommand cmd = new SqlCommand(sql, cn)) 
    { 
     cn.Open(); 

     using (IDataReader rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       yield return (IDataRecord)rdr; 
      } 
     } 
    } 
} 
+0

これは何度も何度もクエリを呼び出しているということですか?ループを使わない方法はありますか?ありがとうございます –

+0

おそらく私はあなたの元の質問を理解していない。あなたが達成しようとしていることを正確に記述できますか? –

+0

私はフィールドが文字列の配列でなければならないことを理解することができますが、私はメソッドを一度呼び出すので、1つのクエリを実行します...フィールド名... field1、field2、field3をパラメータとして入力します。フィールド2、フィールド3 ...」と表示されます。メソッドを配列として呼び出す...そして与えられたフィールド名でデータを出力する。例えば配列["field1"]、配列["field2"]など –

関連する問題