2017-01-16 2 views
0

Ich versuche, Datenleser an eine Methode zu übergeben, aber Fehler immer wie unten:Datenleser geschlossen erhalten, während ein Verfahren vorbei

ungültiger Versuch Fieldcount zu rufen, wenn Leser geschlossen ist.

-Code:

public class ImportService 
{ 
    public IDataReader Reader { get; set; } 
    public void MyMethod() 
    { 
     string[] Tables = { "Table1", "Table2"}; 
     foreach (var table in Tables) 
     { 
      try 
      { 
       var msSql = new MsSql(table,conn); 
       Reader = msSql.Reader; 
       msSql.Reader.Close(); 
       DumpData(conn, Reader); 
       Reader.Close(); 
      } 
      catch (Exception ex) 
      { 
       //catch exception here 
       Reader.Close();//in case of error while dumping data close the reader. 
      } 
     } 

     conn.close(); 
    } 

    private void DumpData(SqlConnection conn, IDataReader reader) //Invalid attempt to call FieldCount when reader is closed 
    { 
    } 
} 

public class MsSql 
{ 
    public IDataReader Reader { get; set; } 
    public MsSql(string table, SqlConnection Conn) 
    { 
      GetData(table,Conn); 
    } 
    private void GetData(string table, SqlConnection Conn) 
    { 
     string query = "SELECT * FROM " + table; 
     using (SqlCommand cmd = new SqlCommand(query, Conn)) 
     { 
      cmd.CommandTimeout = 0; 
      Reader = cmd.ExecuteReader(); 
     } 
    } 
} 

Ich bin erfolgreich Daten in meinen globalen Objekt Reader bekommen, aber wenn ich es meine DumpData Methode übergeben bekomme ich einen Fehler.

Ich habe überprüft bereits die folgenden Fragen, aber sie konnten mir nicht helfen, mit meinem aktuellen Szenario:

aktualisieren: Wenn Ich übergebe msSql.Reader zu Dumpdata dann funktioniert alles gut wie unten:

DumpData(conn, msSql.Reader); 
+0

Nun, Sie schließen den 'SqlCommand' in' GetData' ... Wie haben Sie erwartet, Daten aus dem geschlossenen Befehl lesen zu können? –

+0

@JonSkeet: Aber ich erhalte Datensätze erfolgreich in meinem msSql.Reader und wenn ich msSql.Reader zu DumpData-Methode übergeben, funktioniert es –

Antwort

2

Was Sie tun, ist dies:

  1. Abrufen der Reader Reader = msSql.Reader;
  2. Schließen des selbigen Reader msSql.Reader.Close();
  3. Der Versuch, Daten aus der zu lesen, jetzt geschlossen, Reader: DumpData(conn, Reader)

So versuchen Sie, von einem geschlossenen Re zu lesen Ader (das ist vermutlich, was DumpData() tut - und eine entsprechende Nachricht erhalten.

Ich denke, Sie arbeiten unter dem Missverständnis, dass Sie ein anderes Objekt erstellen, indem Sie dasselbe Objekt einer anderen Variablen zuweisen. Das ist nicht so. Sie beziehen sich nur auf mehr als einen Punkt.

So: msSql.Reader und die lokale Reader beide beziehen sich auf das gleiche Objekt.

+0

Ok, ich verstehe jetzt und Sie haben Recht, aber der Grund hinter dies ist, weil, wenn ich irgendwie rein dumpmethod dann wie schließe ich dann den leser der mssql-klasse? –

+1

sollten Sie eine 'using' Aussage um Ihren Lesercode benutzen - die verursacht, dass der Leser entsorgt wird und deshalb geschlossen wird, unabhängig von Ausnahmen usw. –

+0

In Ordnung. Vielen Dank für die Hilfe und bitte helfen Sie weiter so :) –

Verwandte Themen