C#中数据库的代码无法正常工作

时间:2016-02-23 06:44:31

标签: c# ms-access

您好我有一个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();
        }

4 个答案:

答案 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
}

如何解决此错误“指定演员无效”