无法将类型为'System.Int32'的对象转换为DataReader.GetString()中的'System.String'类型

问题描述 投票:8回答:3

我正在尝试将数据库中的数据添加到组合框。

        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']

我在这里想念什么?

c# sqldatareader
3个回答
20
投票

您的列的类型不是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);
}

1
投票

您的列似乎没有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);
}

0
投票

好吧。解决了....

这里是代码。.

        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。谢谢你们的帮助。我期望更多,因为我只是我项目的一半。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.