C# 用SQL Server列值填充组合框
请您帮助我,我正在尝试用SQL Server表中某列的值填充一个组合框。我尝试了各种方法,但没有一种返回预期的结果 错误是: 错误CS1503参数1:无法从“字符串”转换为“int” 这是我的代码: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() {
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
用于将标签和id绑定到组合框ValueMember
- 我会这样做:
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
用于将标签和id绑定到组合框ValueMember
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
而不是简单的自定义类?