2016-04-10 9 views
-1

Ich arbeite derzeit an einer College-Zuordnung, in der ich Probleme beim Lesen von Daten aus einer SQL Server-Datenbank habe. Ich versuche, die Dentist Name Spalte zu lesen und dann diese Namen zu einer Combobox hinzuzufügen.Cant lesen von SQL Server-Datenbank in C#

Allerdings, wenn ich den Spaltennamen eingeben, zeigt es einen Fehler.

ist mein Tisch dentistInfo mit Spalten Dentist ID, genannt Dentist Name, Dentist Surname, DOB und Gender.

Irgendwann, wenn ich das Lesen richtig gemacht habe, werde ich hoffentlich in der Lage sein, ihre Details zu füllen, wenn die Namen aus der Combobox ausgewählt werden.

public partial class Dentist_Info : Form 
{ 
    Surgery mySurgery = new Surgery(); 
    private SqlConnection conn; 
    private SqlCommand cmd; 
    private SqlDataAdapter da; 
    Surgery _formsSurgery; 

    public Dentist_Info(Surgery SurgeryToDisplay) 
    { 
     _formsSurgery = SurgeryToDisplay; 
    } 

    public void FillCombo() 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"); 
     SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 

     SqlDataReader myreader; 
     conn.Open(); 

     try 
     { 
      myreader = SelectCommand.ExecuteReader(); 

      while (myreader.Read()) 
      { 
       string dname = myreader.GetString("Dentist Name"); 
       comboBox1.Items.Add(dname); 
      } 

      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message, ex); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Close(); 
      } 
     } 
    } 
+0

Änderung dieser Zeile 'String dname = myreader.GetString ("Dentist Name"); 'zu 'string dname = (string) myreader [" Zahnarzt Name "];' würde sicher helfen, wenn wir wüssten, was der Fehler auch war. – MethodMan

+2

Sie haben Leerzeichen als Teil Ihrer Spaltennamen und dies wird einen Fehler bei der Auswertung der SQL-Abfrage auslösen.Wenn Ihre Datenbank SQL Server ist, versuchen Sie dies "SELECT [Zahnarzt-ID], [Zahnarzt-Name], [Zahnarzt-Familienname], DOB, Gender VON DentistInfo". Wenn es sich um MySQL handelt, verwenden Sie Grave Accent anstelle von eckigen Klammern. – derloopkat

+0

Sie müssen die eigentliche Fehlermeldung posten. Es ist wie in die Garage zu gehen und zu sagen, mein Auto ist kaputt, repariere es. –

Antwort

0

Versuchen: Ich empfehle Ihnen, setzen [] in der Zahnarzt-Name, da es einen Raum zwischen den beiden Wörtern, durch die Sie den Fehler verursachen könnten, oder den Namen aus der Datenbank

public void FillCombo() 
    { 
     SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True"); 
     SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 
     conn.Open(); 
     DataSet ds = new DataSet(); 
     SqlDataAdapter da = new SqlDataAdapter(SelectCommand); 
     da.fill(ds); 

     foreach(DataRow dr in ds.Tables[0].Rows) 
     { 
      comboBox1.Items.Add(dr["[Dentist Name]"].ToString()); 
     } 
     conn.Close(); 
    } 
DentistName ändern

per zusätzlich anstelle der Verwendung conn.Open() und conn.Close(), wie die Antwort des ersten Benutzers Sie die Verbindung in einem mit wie so umgeben kann:

using(SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True")) 
{ 
    //your codes here no need for conn.Open() and conn.Close() 
} 
+0

Nochmals vielen Dank für die Antworten ... Ich habe den Code JC Borlagdan eingegeben, aber ich habe den folgenden Fehler gegeben: Argument 1: kann nicht von System.Data.SqlClient.SqlComand in Zeichenfolge konvertieren. es ist unterstrichen auf diesem Bit des Codes: DataSet ds = neues DataSet (SelectCommand); Der SelectCommand innerhalb der Klammern ist unterstrichen. – Griff

+0

aaah meine schlechte ... editierte sir –

+0

Brilliant danke JC - Die Namen haben die Combobox bevölkert - Vielen Dank für Ihre Hilfe. – Griff

1

Pro-Tipp: Wenn Sie über einen Fehler fragen wollen, schreibt die Fehler.

In jedem Fall ist das Problem in diesem Fall leicht zu erkennen. Es gibt keine Überladung von GetString, die eine Zeichenfolge als Argument akzeptiert - Sie können nur den Spaltenindex verwenden.

Sie müssen also entweder den Spaltenindex (myreader.GetOrdinal("Dentist Name")) übergeben oder den Indexer ((string)myreader["Dentist Name"]) verwenden. Stellen Sie in jedem Fall sicher, dass mögliche NULL-Werte ordnungsgemäß behandelt werden - der Datenleser löst einfach eine Ausnahme aus, wenn Sie versuchen, einen SQL-NULL-Wert zu lesen.

Als beiseite, Ihr try ... catch vereinfacht werden kann (und nützliche):

  • Wenn Sie wollen eine Ausnahme erneut auslösen, verwendet throw; (kein "Argument"). Umschließen Sie die Ausnahme nur, wenn Sie Informationen hinzufügen möchten.
  • Die Klausel catch ist nicht erforderlich. Es scheint, dass Sie es nur für die finally verwenden - es ist völlig in Ordnung, einfach try ... finally ohne die catch zu verwenden.
  • kann nie null in der finally-Klausel sein - Ihre try ist nicht lang genug.
  • Für ein Muster wie dieses möchten Sie using anstelle von try ... finally sowieso verwenden. Sie sollten auch using für den Datenleser verwenden. diese
+0

Ein Datenleser kann eine Null gut lesen, solange du etwas liest, das mit Nullen umgehen kann. Lesen Sie in ein Objekt, überprüfen Sie, ob es sich um eine Zeichenfolge handelt, und um eine Umwandlung, falls dies der Fall ist. –

+0

@LorenPechtel Das ist bekannt als "mögliche NULL Werte richtig behandeln". 'GetString' (und Freunde) werfen, der Indexer gibt' DBNull.Value' zurück. Der einfachste (und billigste) Weg besteht darin, einfach die 'IsDBNull'-Methode zu verwenden. – Luaan

+0

Vielen Dank für alle Antworten..Ich werde sicherstellen, dass der Fehler bei weiteren Problemen beiliegt..Ich werde versuchen, die Antworten zu geben, wenn ich nach Hause komme .. Nur so verstehe ich, ist der Fehler passiert, wenn es ein trifft Null-Wert und ich hatte keine Ausnahme für diese – Griff