2016-07-04 6 views
0

Ich möchte Liste von SemesterID basierend auf StudentID wie unten gezeigt zeigen.Bindung von zwei SQL-Anweisungen innerhalb einzelner Methode mit ArrayList in (SQL & C#)

in comboBox1 i StudentIDs aufgeführt haben, aber geben Sie mir ein Fehler:

Fehler # 1

Con nicht geschlossen ist.

Fehler # 2

Datareader ist bereits im Einsatz ...


public void bindStudentID() 
{ 
    try 
    { 
     ArrayList a = new ArrayList(); 

     con.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT studentId FROM tbStudent",  con); 
     SqlDataReader dr = cmd.ExecuteReader(); 

     while (dr.Read()) 
     { 
      a.Add(dr["studentId"]); 
     } 
     comboBox1.DataSource = a; 


     ArrayList aa = new ArrayList(); 
     SqlCommand cmdd = new SqlCommand("SELECT SemesterID FROM tbSemester  Where StudentID='" + comboBox1.Text + "'", con); 
     SqlDataReader drr = cmd.ExecuteReader(); 
     while (drr.Read()) 
     { 
      aa.Add(drr["SemesterID"]); 
      comboBox2.DataSource = aa; 
     } 
     con.Close(); 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
    } 
} 
+0

sirr ?????? @ Arulkumar –

Antwort

0

Sie haben vergessen, den Leser so zu schließen:

// Call Close when done reading. 
reader.Close(); 

versuchen, diese Syntax für die Verbindung verwendet wird, ist es sicherer:

using (SqlConnection connection = 
       new SqlConnection(connectionString)) 
    { 
     SqlCommand command = 
      new SqlCommand(queryString, connection); 
     connection.Open(); 

     SqlDataReader reader = command.ExecuteReader(); 

     // Call Read before accessing data. 
     while (reader.Read()) 
     { 
      ReadSingleRow((IDataRecord)reader); 
     } 

     // Call Close when done reading. 
     reader.Close(); 
    } 
+0

nicht meine Frage .... PLZ las meine Frage @ChenChi –

+0

Ja, aber Sie müssen Lösen Sie zuerst Ihre Fehler, um das zu lösen, was Sie wollen – ChenChi

+0

Warum verwenden Sie ArrayList? Ich glaube nicht, dass das der richtige Weg ist, um das zu tun, was Sie wollen ... Ihre Frage ist nicht klar ... schreiben Sie, was genau Sie mit dieser Methode erreichen wollen – ChenChi

0

Ich denke, dieser Code gut funktioniert. Dieser Code erklärt sich selbst. Sie haben ein SqlDataReader-Objekt erstellt, ohne das vorherige zu löschen.

public void bindStudentID() 
{ 
    try 
    { 
     ArrayList a = new ArrayList(); 

     con.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT studentId FROM tbStudent",  con); 

     SqlDataReader dr = cmd.ExecuteReader(); 

     while (dr.Read()) 
     { 
      a.Add(dr["studentId"]); 
     } 
     comboBox1.DataSource = a; 

     ArrayList aa = new ArrayList(); 
     SqlCommand cmdd = new SqlCommand("SELECT SemesterID FROM tbSemester  Where StudentID='" + comboBox1.Text + "'", con); 
     dr = null; 
     dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      aa.Add(drr["SemesterID"]); 

     } 
     comboBox2.DataSource = aa; 
     con.Close(); 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
    } 
} 

Bitte als Antwort markieren, wenn ich

0

Check dies,

es

sein sollte
SqlDataReader drr = cmd.ExecuteReader(); 

half

SqlDataReader drr = cmdd.ExecuteReader(); 

Sie verwenden cmd statt CMDD Befehl

0

MSDN sagt:

Sie sollten immer die Close-Methode aufrufen, wenn Sie fertig sind das Datareader-Objekt. Wenn Ihr Befehl Ausgabeparameter oder Rückgabewerte enthält, sind diese erst verfügbar, wenn der DataReader geschlossen wird. Beachten Sie, dass während ein DataReader geöffnet ist, die Verbindung ausschließlich von diesem DataReader verwendet wird. Sie können keine Befehle für die Verbindung ausführen, einschließlich das Erstellen eines anderen DataReader, bis der ursprüngliche DataReader geschlossen wird.

So basiert auf MSDN, versuchen Sie dies:

public void bindStudentID() 
{ 
//instantiating a ArrayList object does not need to be included inside Try/Catch block 
//try 
//{ 
    ArrayList a = new ArrayList(); 
try 
{ 
    //Before opening the connection make sure that connection's current state is not open, otherwise you will get exception 
    //con.Open(); 
if (con.State != ConnectionState.Closed) 
{ 
    con.Close(); 
} 
con.Open(); 
    SqlCommand cmd = new SqlCommand("SELECT studentId FROM tbStudent",  con); 
    SqlDataReader dr = cmd.ExecuteReader(); 

    while (dr.Read()) 
    { 
     a.Add(dr["studentId"]); 
    } 
    comboBox1.DataSource = a; 

//You should close data reader before using it again or defining new one 
    dr.Close(); 

    ArrayList aa = new ArrayList(); 
//No need to define new SqlCommand object and you can use the prev one 
    cmd = new SqlCommand("SELECT SemesterID FROM tbSemester  Where StudentID='" + comboBox1.Text + "'", con); 

//No need to define new SqlDataREader object and you can use the prev one 
    dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     aa.Add(dr["SemesterID"]); 
     //I think this should be stated out of the while block    
     //comboBox2.DataSource = aa; 
    } 
    comboBox2.DataSource = aa; 
    //You should close data reader before using it again or defining new one 
    dr.Close(); 
//Close the connection in finally block   
//con.Close(); 

} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
finally 
{ 
//You should also close the connection even if an exception raised 
     con.Close(); 

} 
}