我正在尝试将数据库中的数据添加到组合框。
try
{
SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con);
SqlCeDataReader dr = com.ExecuteReader();
while(dr.Read()){
string name = dr.GetString(1);
cmbProductCategory.Items.Add(name);
}
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
我收到以下异常:
无法将类型为'System.Int32'的对象转换为类型为'System.String']
我在这里想念什么?
您的列的类型不是string
。显然是int
。因此使用:
dr.getInt32(1).ToString()
甚至
dr.GetValue(1).ToString()
在数据库中键入更改应该更粗鲁。
作为某种一般性建议,我至少尝试遵循:
例如使用字段名称访问字段
dr.GetGuid(dr.GetOrdinal("id"))
这样的事情也可以通过扩展方法很好地解决:
public T GetFieldValue<T>(this DbDataReader reader, string columnName)
{
return reader.GetFieldValue<T>(reader.GetOrdinal(columnName));
}
附带说明:包括堆栈跟踪信息(或至少说明异常代码来自代码的哪一行)可能对其他试图帮助您的人有所帮助。正如您从野蛮猜测中看到的那样,罪魁祸首可能是什么。我的猜测是堆栈跟踪看起来像这样:
SqlDataReader.GetString
YourCode.YourMethod
[GetString
或多或少看起来像这样:
public string GetString(int index)
{
return (string) GetValue(index);
}
您的列似乎没有int类型。为了避免出现这种情况,可以使用列名而不是索引。
try
{
SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con);
SqlCeDataReader dr = com.ExecuteReader();
while(dr.Read()){
string name = dr["yourColumnName"].ToString();
cmbProductCategory.Items.Add(name);
}
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
好吧。解决了....
这里是代码。.
try
{
SqlCeCommand com = new SqlCeCommand("select CategoryName from Category_Master", con);
SqlCeDataReader dr = com.ExecuteReader();
while(dr.Read()){
string name = dr.GetString(0);
cmbProductCategory.Items.Add(name);
}
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
我将sqlcommand更改为单个值,并将dr.getstring()的列号更改为0。谢谢你们的帮助。我期望更多,因为我只是我项目的一半。