在SqlDataReader上调用GetString会给我一个InvalidCastException

时间:2015-07-20 17:22:10

标签: c# casting ado.net

我希望在列表框的arraylist中移动数据,但是它给出了错误。 错误:

  

未处理的类型' System.InvalidCastException'发生了   在System.Data.dll中附加信息:您无法转换   类型对象System.Int32' on type' System.String'。

这在线上发生:fill_arry[i] = objReader.GetString(1);

代码:

public void Fill_List(ArrayList fill_arry)
{
    SqlDataReader objReader;
    SqlCommand objcmd =null;

    int i = 0;

    vsql = "SELECT [NOME] As Identificador,[RGP],[NOME],[ENDERECO],[CIDADE],[ESTADO],[TELEFONE],[CELULAR] FROM pescador";

    if (this.Conectar())
    {
        try
        {
            objcmd = new SqlCommand(vsql, objCon);
            objReader = objcmd.ExecuteReader();

            while (objReader.Read())
            {
                fill_arry[i] = objReader.GetString(1);
            }
        }
        catch (SqlException erro)
        {
            throw erro;
        }
        finally
        {
            this.Desconectar();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

编辑:

  

不,我需要得到NOME

所以[NOME]是所需的字段,更改:

fill_arry.Add(objReader.GetString(1));

要:

fill_arry.Add(objReader.GetString(0));

注意:正如sstan在他的回答中写道,你正在检索[RGP]列值,这是你想要的吗?因为它是一个int你必须转换。如果您希望获得[NOME]而不是将1更改为0,因为索引从零开始。

使用普通List比旧ArrayList更受欢迎。使用List而不是ArrayList不需要进行强制转换。 ArrayList存储对象引用。 你最终会得到一个像:

这样的函数
public void Fill_List(List<string> fill_arry)
{
    SqlDataReader objReader;
    SqlCommand objcmd =null;

    int i = 0;

    vsql = "SELECT [NOME] As Identificador,[RGP],[NOME],[ENDERECO],[CIDADE],[ESTADO],[TELEFONE],[CELULAR] FROM pescador";

    if (this.Conectar())
    {
        try
        {
            objcmd = new SqlCommand(vsql, objCon);
            objReader = objcmd.ExecuteReader();

            while (objReader.Read())
            {
                //The value is added to List<string> fill_arry here.
                fill_arry.Add(objReader.GetString(1));
            }
        }
        catch (SqlException erro)
        {
            throw erro;
        }
        finally
        {
            this.Desconectar();
        }
    }
}

方法应该像这样调用:

List<string> strList = new List<string>();
Fill_List(strList);

参考下面的答案,了解为什么不应该使用ArrayList而不是List。

答案的简短引用:

  

ArrayList属于C#没有泛型的日子。它的   不赞成使用List。你不应该在new中使用ArrayList   除非您必须与旧的接口,否则以.NET&gt; = 2.0为目标的代码   使用它的API。

SO answer

答案 1 :(得分:3)

正如其他人所说,使用List<T>代替ArrayList是更好的做法。但这不是你错误的原因。

您的错误原因是:objReader.GetString(1)

这是尝试获取列RPG的值,就好像它是string一样,实际上,根据错误,它是int

要摆脱错误,但仍然以字符串形式获取值,只需将其更改为objReader.GetInt32(1).ToString()

编辑:嗯,显然,你想要[NOME],而不是[RGP]:)

指定它会很好。 SqlDataReader上的索引从0开始。所以要获得NOME,您需要将其作为:

获取
objReader.GetString(0);

或者,更好的是,如果你想避免错误索引,为什么不这样做呢:

(string)objReader["Identificador"]; // named parameter instead of an index, yay!