11

我试图将数据库中的数据添加到组合框。

        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”类型

我在这里想念什么?

4

5 回答 5

25

您的列没有 type 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);
}
于 2013-10-25T06:11:53.990 回答
2

您的专栏似乎没有 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);
}
于 2013-10-25T06:15:01.783 回答
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 .. 它起作用了。谢谢你们的帮助..我期待更多,因为我的项目只有一半..

于 2013-10-25T06:35:57.320 回答
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);
                }
于 2020-08-05T11:17:08.523 回答
0

您可以尝试以下转换:

  Convert.ToInt32(yourstring)
于 2021-11-30T11:14:03.943 回答