[英]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.