繁体   English   中英

代码无法从C#中的数据库正常运行datareader

[英]Code not working properly datareader from database in C#

嗨,我收到一个InvalidCastException,说“指定的转换无效”。 我不知道问题出在哪里。 我的代码有错误吗? 词表列是文本字段。

这是我的代码:

 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();
        }

基本上,您没有正确使用阅读器。 DbDataReader.Read()返回一个布尔值,该布尔值指示是否需要处理另一行结果。 您目前正在将其视为返回下一个结果,如果到达流末尾则返回null 这根本不是DbDataReader工作方式。

移至下一个结果后,您需要调用GetString或索引器以自己获取数据。 例如,循环可能类似于:

while (reader.Read())
{
    string word = reader.GetString(0);
    // Use it
}

现在,这一次可以读取一个结果-听起来您实际上真的很在乎读取结果的顺序 ,就好象一行中紧接着一串其他相关字词一样。 这种结构应该反映在您的数据库中-您不应该仅仅假设“文本文件中的行列表==数据库中的行列表”。 除了任何其他内容,您都没有在查询中指定任何顺序,因此数据库可以自由以其想要的任何顺序返回那些行,可能会丢失您的隐式结构。 更一般地,表中的一行不应该依赖于“下一行” ...如果要在行之间建立关系,则应在数据中表示这些关系。

您还应该对连接,命令和阅读器使用using语句。

 string str = reader.Read().ToString();
 while (str != null)
 { 

应该

while (reader.Read())
{ 
    string str = (string)reader["Wordlist"]; // or reader[ColIndex]

因为必须选择要读取的列和reader.Read().ToString()将仅返回"True""False"而不是您要读取的值。

您在做什么错误:您没有以正确的方式使用阅读器,这就是为什么阅读器无法按预期工作的原因。 reader.Read()将返回一个Boolean值。

当没有更多行可供读取时,它将为false。 否则它将是真实的。

在您的情况下,您正在使用reader.Read().ToString();将布尔值转换为String reader.Read().ToString(); 这将为str分配“ True”或“ False”,因此它根本不会为null (因为while条件为str != null ),因此while变成了无限循环。 如果读者没有行/空值,Will也会抛出异常

解:

您可以按照以下方式正确使用阅读器:

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);          
    }
while (reader.Read())
{
    string word = reader.GetString(0);
    // Use it
}

如何解决此错误“指定的转换无效”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM