您好我有一个InvalidCastException,说"指定演员表无效"。我不知道问题出在哪里。我的代码有错误吗? Wordlist列是文本字段。
这是我的代码:
public static void Load_Processing_Words()
{
OleDbConnection con = new OleDbConnection();
con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\USDB\USDB.accdb; Persist Security Info=False;";
con.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
string query = "Select Wordlist from Words";
cmd.CommandText = query;
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
//while (str != null)
{
string str = reader.GetString(0);
char[] chArray;
string[] strArray;
string str2;
if (str.Contains("Postfix_Exception"))
{
str = reader.GetString(0);
chArray = new char[] { '\t', '\n', '\r' };
while (!str.Contains("Prefix_Exception"))
{
strArray = str.Split(chArray, StringSplitOptions.RemoveEmptyEntries);
if (strArray.Length != 0)
{
str2 = strArray[0];
if (!Postfix_Exception.Contains(str2))
{
Postfix_Exception.Add(str2, 1);
}
}
str = reader.GetString(0);
}
}
}
con.Close();
}
答案 0 :(得分:4)
基本上,您没有正确使用阅读器。 DbDataReader.Read()
返回 Boolean 值,表示是否设法需要另一行结果。您当前正在将其视为返回下一个结果,如果它到达流的末尾,则返回null
。这根本不是DbDataReader
的工作方式。
一旦您转到下一个结果,您需要调用GetString
或索引器来自己获取数据。例如,你的循环应该是这样的:
while (reader.Read())
{
string word = reader.GetString(0);
// Use it
}
现在,这将一次读取一个结果 - 但听起来你真的非常关心你读取结果的 order ,好像有一行后跟一堆其他的相关话。这种结构应该反映在您的数据库中 - 您不应该只假设“文本文件中的行列表==数据库中的行列表”。除了其他任何内容之外,您还没有在查询中指定任何排序,因此数据库可以按任何顺序自由返回这些行,可能会丢失您的隐式结构。更一般地说,表中的一行不应该依赖于“下一行”...如果你想要行之间的关系,那些应该在数据中表示。
您还应该使用using
语句作为连接,命令和阅读器。
答案 1 :(得分:1)
string str = reader.Read().ToString();
while (str != null)
{
应该是
while (reader.Read())
{
string str = (string)reader["Wordlist"]; // or reader[ColIndex]
因为您必须选择要阅读的列,而reader.Read().ToString()
只会返回"True"
或"False"
而不是您想要阅读的值。
答案 2 :(得分:1)
你在做什么错误:
您没有以正确的方法使用阅读器,这就是为什么它没有按预期工作。 reader.Read()
将返回Boolean
值。
当没有可用的行时,它将是false 阅读。否则就是真的。
在您的情况下,您使用reader.Read().ToString();
将布尔值转换为字符串。这会将“True”或“False”分配给str
,因此它不会在null
处all(因为你的while条件是str != null
)因此while变成了无限循环。如果读者没有行/ null
<强>解决方案:强>
您可以按照以下方式正确使用阅读器:
while (reader.Read())
{
// Enter this loop only when reader has rows
// Iterate through each row until their is no rows to read.
// assign value to string variable like the following
str = reader.GetString(0);
}
答案 3 :(得分:0)
while (reader.Read())
{
string word = reader.GetString(0);
// Use it
}
如何解决此错误“指定演员无效”