2017-09-18 1 views
0

Ich brauche eine schnelle Hilfe. Ich erhalte einen Fehler ungültiger Versuch, Lesezugriff zu erhalten, wenn der Reader geschlossen wird, wenn ich versuche, meine Databagrid-Ansicht aus dem Reader hinzuzufügen.So füllen Sie erfolgreich die Datagridview - Fehler erhalten ungültiger Versuch, lesen zu rufen, wenn der Leser in C geschlossen ist #

Die Datenbanken sind eine Klasse, die die Datenbankverbindungszeichenfolge aufruft. und databaseColumn ist eine Klasse, die alle Spaltennamen hat.

Fehler für Spalte Time_Completed enter image description here

, was die Probleme ist bitte helfen

Hier ist der Code:

//datagridview, bindingsource, data_apapter global objects variables 
     private DataGridView dataGridView = new DataGridView(); 
     private BindingSource bindingSource = new BindingSource(); 
     private SqlDataAdapter dataAdapter = new SqlDataAdapter(); 


     //class objects 
     Databases lemars = new Databases(); 
     Databases schuyler = new Databases(); 
     Databases detroitlakeskc = new Databases(); 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btn_Exit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     private void comboBox_Database_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (comboBox_Database.SelectedItem.ToString() == "LeMars21St") 
      { 
       GetDataToDataGridView(); 
      } 
     } 

     private void GetDataToDataGridView() 
     { 
      //prgBar_DataGridViewLoading 
      DatabaseColumns Obj = new DatabaseColumns(); 
      String SqlcmdString = "Select * from dbo.AllInvoicesInReadyStatus"; 
      SqlDataReader reader; 
      int i = 1; 
      try 
      { 
       using (SqlConnection conn = new SqlConnection(lemars._LeMarsConnectionString)) 
       { 

        reader = null; 
        SqlCommand Sqlcmd = new SqlCommand(SqlcmdString, conn); 
        conn.Open(); 
        reader = Sqlcmd.ExecuteReader(); 

        if (reader.HasRows) 
        { 
         try 
         { 
          while (reader.Read()) 
          { 

           Obj.Invoice = reader["invoice"].ToString(); 
           Obj.Shipment = reader["shipment"].ToString(); 
           Obj.Project = reader["Project"].ToString(); 
           Obj.InvoiceDateTB = Convert.ToDateTime(reader["invoiceDateTB"]); 
           Obj.CreatedDate = Convert.ToDateTime(reader["CreatedDate"]); 
           Obj.TypeName = reader["typeName"].ToString(); 
           Obj.ExportedDate = Convert.ToDateTime(reader["exportedDate"]); 
           Obj.StatusName = reader["statusName"].ToString(); 
           Obj.Total = Convert.ToDecimal(reader["total"]); 
           Obj.ImportStatus = reader["import_status"].ToString(); 
           //DateTime dateFacturation; 
           int colIndex = reader.GetOrdinal("Time_Completed"); 
           if (!reader.IsDBNull(colIndex)) 
            Obj.TimeCompleted = reader.GetDateTime(colIndex); 
           Obj.ErrorDescription = reader["ERROR_DESCRIPTION"].ToString(); 

           //bindingSource.DataSource = reader; 
           DataTable dt = new DataTable(); 
           dt.Load(reader); 
           dataGridView.DataSource = dt; 

           i++; 
          } 
         } 
         finally 
         { 
          reader.Close(); 
         } 
          conn.Close(); 
        }     
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 



    } 
} 
+0

Können Sie den Fehler, den Sie bekommen posten? –

+0

Ich erhalte den folgenden Fehler, daher lädt die Datagridview nie alle 12 Spalten, die ich hinzufügen möchte. FEHLER: Ungültiger Leseversuch beim Schließen des Lesers – AndresBryan29

+0

Vermutung, dass dt.load den Reader schließt, nachdem er beendet wurde. –

Antwort

2

DataTable.Load Methode automatisch zur Zeit DataReader Instanz schließt läuft, daher wird es scheitern an die nächste Iteration (die Ausnahme hat klar gesagt, dass die DataReader bereits geschlossen ist).

um dieses Problem zu beheben, rufen Sie DataTable.Load unmittelbar nach ExecuteReader (dh nach durch HasRows Überprüfung) und Sie DataTable Inhalte aus, dass laufen können, unten in Beispiel als gegeben:

using (SqlConnection conn = new SqlConnection(lemars._LeMarsConnectionString)) 
{ 
    reader = null; 
    SqlCommand Sqlcmd = new SqlCommand(SqlcmdString, conn); 
    conn.Open(); 
    reader = Sqlcmd.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     try 
     { 
      DataTable dt = new DataTable(); 
      dt.Load(reader); 

      for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       Obj.Invoice = dt.Rows[i]["invoice"].ToString(); 
       Obj.Shipment = dt.Rows[i]["shipment"].ToString(); 
       Obj.Project = dt.Rows[i]["Project"].ToString(); 

       // other stuff 
      } 

      dataGridView.DataSource = dt; 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 
} 

Update 1:

Seit einem Ihrer Datetime-Spalte DBNull.Value enthalten kann, können Sie überprüfen, indem entweder Convert.IsDBNull:

Oder mit is Operator mit DBNull:

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    if (!(dt.Rows[i]["Time_Completed"] is DBNull)) 
    { 
     Obj.TimeCompleted = Convert.ToDateTime(dt.Rows[i]["Time_Completed"]); 
    } 
} 

Alternativ können Sie ternären Operator verwenden und DateTime.MinValue, wenn der Spalt Nullwert hat.

Verwandte Themen:

Error: Invalid attempt to call Read when reader is closed after the while loop?

C# - Invalid attempt to call Read when reader is closed

+0

danke Mann, das hat funktioniert. Jetzt konnte ich die Daten zu meinem DataGridView hinzufügen. aber es gibt 1 Problem, eine der Spalten Time_Completed ist eine Datumsspalte und die meiste Zeit wird immer NULL sein, also bekomme ich aus irgendeinem Grund einen Fehler. Ich werde den Fehler über meinem ersten Beitrag hinzufügen. – AndresBryan29

+0

@ AndresBryan29 Antwort aktualisiert mit Beispiel Verwendung von 'DBNull' Prüfung auf' Time_Completed' Spalte. –

+0

Amazing bro, das hat gut und schön funktioniert, danke für Ihre Hilfe. Ich habe viel daran gelernt. – AndresBryan29

Verwandte Themen