无法将类型为“System.Int32”的对象强制转换为 DataReader.GetString() 中的类型“Sys
本文关键字:类型 GetString DataReader 转换 Sys System Int32 对象 | 更新日期: 2023-09-27 18:36:58
我试图将数据从数据库添加到ComboBox
。
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);
}
您可以
尝试以下转换:
Convert.ToInt32(yourstring)
好的,解决了....
这是代码..
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..它起作用了。谢谢你们的帮助..我期待更多,因为我的项目只完成了一半。
在查询中使用列名,然后在读取器中指定该列名。
SqlCeCommand com = new SqlCeCommand("select catg from Category_Master", con);
SqlCeDataReader dr = com.ExecuteReader();
while(dr.Read()){
string name = dr("catg").ToString();
cmbProductCategory.Items.Add(name);
}