2017-10-19 140 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