我希望在列表框的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();
}
}
}
答案 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。
答案 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!