2017-12-25 4 views
-1

Ich versuche, eine gespeicherte Prozedur mit Parametern auszuführen, und die Ergebnisse in eine DataTable; aber nach der Ausführung, ich diese:wie DataTable aus gespeicherten Prozedur gefüllt werden

this is the screen

Ich kann IDataRecord bekommen, aber ich kann nicht IDataReader - warum? Was vermisse ich? Dank

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

Dieser Aufruf 'data = reader.OfType () .ToArray();' alles lesen Aufzeichnungen. Es gibt nichts mehr im Reader für 'table.Load (reader);' um damit zu arbeiten. – rene

+0

Also das ist zum Beispiel wenn ich alles was ich weiß versuchen. So ist das gleiche Ergebnis, wenn ich diese Codezeile entferne. Und bitte hör auf, einen negativen Punkt zu geben, bevor der Benutzer auf deinen Kommentar antwortet: S: S –

Antwort

0

Wenn Ihr Ziel ist es, eine DataTable von einem SqlCommand, verwenden Sie einen SqlDataAdapter anstelle eines SqlDataReader zu füllen. Hier ist eine praktische Erweiterung Methode:

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; 
    } 
} 

Dann aus dem Code Sie es wie folgt verwenden können:

try 
{ 
    sqlConnection.Open(); 
    table = cmd.ExecuteDataTable(); 
} 
finally 
{ 
    sqlConnection.Dispose(); 
} 
Verwandte Themen