C# 用SQL Server列值填充组合框

C# 用SQL Server列值填充组合框,c#,sql-server,C#,Sql Server,请您帮助我,我正在尝试用SQL Server表中某列的值填充一个组合框。我尝试了各种方法,但没有一种返回预期的结果 错误是: 错误CS1503参数1:无法从“字符串”转换为“int” 这是我的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); fillCombo(); } void fillCombo() {

请您帮助我,我正在尝试用SQL Server表中某列的值填充一个组合框。我尝试了各种方法,但没有一种返回预期的结果

错误是:

错误CS1503参数1:无法从“字符串”转换为“int”

这是我的代码:

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

我会这样做:

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";
Dictionary=newdictionary();
while(dr.Read())
{
字符串lveName=dr[“lve_name”].ToString();
int lveId=int.Parse(dr[“lve_id”].ToString());
添加(lveId,lveName);
}
lveType.DataSource=newbindingsource(lveNames,null);
lveType.DisplayMember=“lveName”;
lveType.ValueMember=“lveId”;
  • 假设您有id
    lve\u id
  • DisplayMember
    ValueMember
    用于将标签和id绑定到组合框

    • 我会这样做:

      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";
      
      Dictionary=newdictionary();
      while(dr.Read())
      {
      字符串lveName=dr[“lve_name”].ToString();
      int lveId=int.Parse(dr[“lve_id”].ToString());
      添加(lveId,lveName);
      }
      lveType.DataSource=newbindingsource(lveNames,null);
      lveType.DisplayMember=“lveName”;
      lveType.ValueMember=“lveId”;
      
      • 假设您有id
        lve\u id
      • DisplayMember
        ValueMember
        用于将标签和id绑定到组合框

      始终查看您尝试使用的方法的签名:

      dr.GetString(int)
      
      你在打电话吗

      dr.GetString(string)
      
      但是没有重载的方法接受字符串。看

      相反,
      GetString
      要求您传递试图从中获取字符串的列的从零开始的序号。假设
      lve_name
      是查询中的第二列(有点难说,因为您使用的是
      SELECT*FROM
      ,但这是另一个主题),您必须这样使用它:

      string lveName = dr.GetString(1);
      
      string lveName = dr["lve_name"].ToString()
      
      此外,请检查文档内容:

      不进行任何转换;因此,检索到的数据必须已经是字符串

      这意味着,如果查询返回的不是字符串,则该方法很可能会抛出一个
      InvalidCastException
      。为了防止这种情况发生,您必须编辑查询,例如

      SELECT lve_id, CAST(lve_name as varchar) FROM LEAVE
      
      另一种可能的解决方案是访问以下列:

      string lveName = dr.GetString(1);
      
      string lveName = dr["lve_name"].ToString()
      

      始终查看您尝试使用的方法的签名:

      dr.GetString(int)
      
      你在打电话吗

      dr.GetString(string)
      
      但是没有重载的方法接受字符串。看

      相反,
      GetString
      要求您传递试图从中获取字符串的列的从零开始的序号。假设
      lve_name
      是查询中的第二列(有点难说,因为您使用的是
      SELECT*FROM
      ,但这是另一个主题),您必须这样使用它:

      string lveName = dr.GetString(1);
      
      string lveName = dr["lve_name"].ToString()
      
      此外,请检查文档内容:

      不进行任何转换;因此,检索到的数据必须已经是字符串

      这意味着,如果查询返回的不是字符串,则该方法很可能会抛出一个
      InvalidCastException
      。为了防止这种情况发生,您必须编辑查询,例如

      SELECT lve_id, CAST(lve_name as varchar) FROM LEAVE
      
      另一种可能的解决方案是访问以下列:

      string lveName = dr.GetString(1);
      
      string lveName = dr["lve_name"].ToString()
      

      dr.GetString
      需要一个
      int
      作为参数传递,您正在传递一个
      string
      。您需要的是文档
      dr.GetString
      需要一个
      int
      作为参数传递,您正在传递一个
      string
      。文档就是您需要的。谢谢waka,是的,这是第二列,但是当我尝试您的字符串“string lveName=dr.GetString(1);”时,我收到以下消息“无法将'SystemInt16'类型的对象强制转换为键入系统字符串”,但是第二个建议有效,谢谢!我只是对第一个建议很好奇,不是吗working@GerhardSteyn:这是因为查询以
      smallint
      的形式返回数据,
      GetString
      似乎不进行任何转换。我已经相应地更新了我的答案。谢谢waka,是的,这是第二列,但是当我尝试您的字符串“string lveName=dr.GetString(1);“我收到以下消息“无法将类型为'SystemInt16'的对象强制转换为类型为系统字符串”时,第二个建议奏效了,谢谢!我只是对第一个建议很好奇,不是吗working@GerhardSteyn:这是因为查询以
      smallint
      的形式返回数据,
      GetString
      似乎不进行任何转换。我已经相应地更新了我的答案。嗨,Rafael Kho,谢谢你的建议。请允许我问一下,您为什么愿意这样做?为什么要使用
      BindingSource
      而不是简单的自定义类?嗨,Rafael Kho,谢谢您的建议。我想问一下,为什么您愿意这样做?为什么要使用
      BindingSource
      而不是简单的自定义类?