2017-10-19 147 views
0

請幫助我,我試圖用SQL Server表中列的值填充組合框。我嘗試了各種方法,但都沒有返回所需的結果。用SQL Server列值填充組合框

的錯誤是:

錯誤CS1503參數1:無法從 '字符串' 到 '廉政' 轉換

這是我的代碼:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     fillCombo(); 
    } 

    void fillCombo() 
    { 
     string con = "Data Source = xxxxx; Initial Catalog = xxxxx; Integrated Security = False; User Id = xxxxx; Password=xxxx;MultipleActiveResultSets=True"; 
     string Query = "select * from LEAVE ;"; 

     SqlConnection conDataBase = new SqlConnection(con); 
     SqlCommand cmd = new SqlCommand(Query, conDataBase); 

     SqlDataReader dr; 

     try 
     { 
      conDataBase.Open(); 
      dr = cmd.ExecuteReader(); 

      while (dr.Read()) 
      { 
       string lveName = dr.GetString("lve_name"); 
       lveType.Items.Add(lveName); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    }  
} 
+0

'dr.GetString'需要一個'INT '作爲參數傳遞,你傳遞一個'字符串'。 – waka

+1

文檔就是你需要的。 [SqlDataReader.GetString方法(Int32)](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getstring%28v=vs.110%29.aspx?f=255&MSPPError= -2147217396) – Reniuz

回答

1

我會做取而代之的是:

Dictionary<int, string> lveNames = new Dictionary<int, string>(); 

while (dr.Read()) 
{ 
    string lveName = dr["lve_name"].ToString(); 
    int lveId = int.Parse(dr["lve_id"].ToString()); 
    lveNames.Add(lveId, lveName); 
} 

lveType.DataSource = new BindingSource(lveNames, null); 
lveType.DisplayMember = "lveName"; 
lveType.ValueMember = "lveId"; 
  • 假設你有ID lve_id
  • DisplayMemberValueMember用於將標籤和ID綁定到組合框。
+0

嗨,Rafael Kho,謝謝你的建議。請問爲什麼你寧願這樣做? –

+0

爲什麼使用'BindingSource'而不是簡單的自定義類? – Alejandro

1

總是看你要使用的方法的簽名:

dr.GetString(int) 

您正在試圖調用

dr.GetString(string) 

,但有沒有過載,它接受一個字符串的方法。請參閱the documentation of GetString()

相反,GetString要求您傳遞試圖從中獲取字符串的列的基於零的序數。比方說,lve_name是查詢中的第二列(有點分不清,因爲你正在使用SELECT * FROM,但那是另一個話題),你必須使用這樣的:

string lveName = dr.GetString(1); 

此外,檢查一下文檔必須說:

不執行轉換;因此,檢索的數據必須已經是一個字符串。

這意味着,如果您的查詢返回字符串以外的任何內容,該方法將最有可能拋出InvalidCastException。爲了防止這種情況發生,你必須編輯您的查詢,例如像

SELECT lve_id, CAST(lve_name as varchar) FROM LEAVE 

另一種可能的解決方案是像這樣訪問列:

string lveName = dr["lve_name"].ToString() 
+0

謝謝瓦卡,是的,它是第二列,但是當我嘗試你的字符串「string lveName = dr。GetString(1);「我得到以下消息」無法將類型爲'SystemInt16'的對象轉換爲類型系統字符串「 –

+0

然而,第二個建議奏效了,謝謝!只是好奇第一個建議不起作用 –

+0

@GerhardSteyn:這是因爲查詢返回的數據是'smallint',看起來'GetString'沒有做任何轉換,我已經更新了我的答案。 – waka