2016-04-10 37 views
-1

我目前正在從事一項大學任務,其中我無法從SQL Server數據庫中讀取數據。我正在嘗試閱讀Dentist Name列,然後將這些名稱添加到組合框中。不能從C#中的SQL Server數據庫讀取

但是,當我輸入列名稱時顯示錯誤。

我的表與列Dentist IDDentist NameDentist SurnameDOBGender稱爲dentistInfo

最終,當我正確完成閱讀時,我希望能夠在從組合框中選擇名稱時填充其詳細信息。

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

改變這一行'字符串DNAME = myreader.GetString(「Dentist Name」);'至 'string dname =(string)myreader [「Dentist Name」];'如果我們知道錯誤是什麼,肯定會有幫助。 – MethodMan

+2

您將空格作爲列名稱的一部分,這會在評估SQL查詢時引發錯誤。如果你的數據庫是SQL Server,試試這個「SELECT [Dentist ID],[Dentist Name],[Dentist Surname],DOB,Gender FROM DentistInfo」。如果是MySQL,則使用重音重音而不是sqare括號。 – derloopkat

+0

您需要發佈實際的錯誤消息。這就像去車庫,並說我的'汽車壞了,修理它' –

回答

0

試試這個:我建議你在牙醫的名稱將[],因爲它有兩個詞之間的空間,這可能會導致你的錯誤,或從數據庫名稱更改爲DentistName

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

按照另外的而不是使用conn.Open()和conn.Close(),爲第一用戶的回答,您可以圍繞一個使用像這樣內部的連接:

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

再次感謝您的答案... 我已經輸入了代碼JC Borlagdan但是我得到了以下錯誤:參數1:無法從System.Data.SqlClient.SqlComand轉換爲字符串。 它在這段代碼上加下劃線:DataSet ds = new DataSet(SelectCommand); 括號內的SelectCommand帶下劃線。 – Griff

+0

aaah我的壞...編輯先生 –

+0

輝煌的謝謝JC - 名稱已填充到組合框 - 非常感謝您的幫助。 – Griff

1

人提示:如果你要問一個錯誤,發佈錯誤

無論如何,在這種情況下很容易發現問題。 GetString沒有超過接受字符串作爲參數的重載 - 您只能使用列索引。

因此,您需要通過列索引(myreader.GetOrdinal("Dentist Name"))或者您需要使用索引器((string)myreader["Dentist Name"])。在任何一種情況下,都要確保正確處理可能的NULL值 - 如果您嘗試讀取SQL NULL值,則數據讀取器只會引發異常。

順便說一句,你try ... catch可以簡化(和更有用):

  • 當你要重新拋出異常,使用throw;(沒有 「說法」)。只有在添加了一些信息的情況下才能處理這個異常。
  • catch子句不是必需的。看起來您只是將它用於finally - 使用try ... finally而沒有使用catch就可以。
  • conn永遠不可能是null在finally子句中 - 您的try不夠長。
  • 對於這樣一種模式,無論如何,您想要使用using而不是try ...... finally。您還應該使用using作爲數據讀取器。
+0

只要你閱讀的東西,可以處理空值,數據讀取器可以讀取空罰款。閱讀一個對象,檢查它是否是一個字符串,如果是,則進行強制轉換。 –

+0

@LorenPechtel這被稱爲「正確處理可能的NULL值」。 'GetString'(和朋友)會拋出,索引器將返回'DBNull.Value'。最簡單的(也是最便宜的)方法就是使用'IsDBNull'方法。 – Luaan

+0

謝謝你所有的答覆..我會確保將任何進一步的問題附加錯誤..我會嘗試給我回家時給出的答案..只是讓我明白,當它打到一個錯誤發生空值,我沒有這個例外 – Griff