这是我的代码
con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/techsoft /PP1.accdb;Persist Security Info=False");
con.Open();
cm = new OleDbCommand("select aa from ab", con);
OleDbDataReader qq;
qq = cm.ExecuteReader();
ArrayList ss = new ArrayList();
while (qq.Read())
{
object[] values = new object[qq.FieldCount];
qq.GetValues(values);
ss.Add(values);
}
如果我使用此语法转换
int[] i = (int[])ss.ToArray(System.Type.GetType("System.Int32"));
发生以下错误“源数组中至少有一个元素无法转换为目标数组类型。”
PLZ建议我一个解决方案或任何其他替代方式
答案 0 :(得分:4)
如果ArrayList
ss
中存在非整数的对象,则需要指定是失败还是忽略它们。
假设你想忽略它们,那么你可以使用LINQ:
int[] res = ss.OfType<int>().ToArray();
(假设你的范围是using System.Linq
。)
答案 1 :(得分:2)
不要使用ArrayList
,转到List<int>
,你可以免费得到你想要的东西(列表中的int数组)。
如果你想引用代表System.Int32的System.Type,我更喜欢没有字符串文字的typeof(int)
和这种不必要的查找。
标识符很难阅读,顺便说一下 - 当你提出问题时,你可能想让它们更容易理解。
其他海报确定了真正的问题:您将数组添加到列表中,而不是整数。也许(?)整数数组,但如果没有更多细节,我们就不会知道。
答案 2 :(得分:1)
据我所知,你放入ss的元素本身就是数组。
然后你试图将这些数组转换为显然不起作用的int。
你应该做的是:
while (qq.Read())
{
//object[] values = new object[qq.FieldCount]; - Necessary?
//qq.GetValues(values); - Necessary?
ss.Add(qq["aa"]);
}
答案 3 :(得分:0)
可能是您的某个值无法转换为Int32。更好的方法是使用通用List类型。其行为类似于ArrayList,但只接受Int32值。然后你可以使用ToArray()方法返回一个真正的Int32 []数组。
答案 4 :(得分:0)
我会使用强类型List<int>
。此外,由于您只是从表中选择一个字段,我会说您的代码可以简化一点:
List<int> myInts = newList<int>();
using(IDataReader reader = cm.ExecuteReader()) {
while (reader.Read())
{
myInts.Add(int.Parse(reader["aa"].ToString()));
}
}
然后你可以做
myInts.ToArray();
答案 5 :(得分:0)
如果您至少使用.NET 3.5:
using System.Linq;
//...
int[] myArray = ss.Cast<int>().ToArray();
否则,您手动通过ArrayList foreach
。