2017-12-25 6 views
-1

パラメータを含むストアドプロシージャを実行し、結果をDataTableに取得しようとしています。しかし、実行した後、私はこれを取得:ストアドプロシージャからDataTableを埋める方法

this is the screen

私はIDataRecordを得ることができますが、私はIDataReaderできない - なぜ?何が欠けていますか?おかげ

public DataTable ExecuteProcedureTest(string storedProcedure, Dictionary<Filter, object> filterValue) 
{ 
    var parameters = GetParams(filterValue); 

    var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["testconn"].ConnectionString); 

    var cmd = sqlConnection.CreateCommand(); 

    SqlDataReader reader; 
    IDataReader dataReader; 
    IDataRecord[] dataRecords; 

    var table = new DataTable(); 

    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = storedProcedure; 

    foreach (var item in parameters) 
    { 
     cmd.Parameters.Add(item); 
    } 

    try 
    { 
     sqlConnection.Open(); 
     reader = cmd.ExecuteReader(); 

     dataRecords = reader.OfType<IDataRecord>().ToArray(); 
     table.Load(reader); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     sqlConnection.Dispose(); 
    } 

    //var count = dataRecords.Count(); 
    return table; 
} 
+0

このコール 'dataRecords = reader.OfType ().ToArray();'すべて読みます記録。読者の中では 'table.Load(reader);'のために残っているものは何もありません。 – rene

+0

それは、私が知っているものすべてを試すときの例です。私はそのコード行を削除すると同じ結果です。そしてあなたのコメントにユーザーの答えが前に否定的なポイントを与えることをやめてください:S:S –

答えて

0

あなたの目標ではなくSqlDataReaderSqlDataAdapterを使用し、SqlCommandからDataTableを満たすことである場合。ここでは便利な拡張メソッドである:あなたのコードから次に

public static class SqlExtensions 
{ 
    public static DataTable ExecuteDataTable(this SqlCommand command) 
    { 
     DataTable table = new DataTable(); 
     using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) 
     { 
      dataAdapter.Fill(table); 
     } 
     return table; 
    } 
} 

あなたはこのようにそれを使用することができます:

try 
{ 
    sqlConnection.Open(); 
    table = cmd.ExecuteDataTable(); 
} 
finally 
{ 
    sqlConnection.Dispose(); 
} 
関連する問題