我正在尝试使用SQlite和sql命令。我正在尝试做一个测验程序,我有一个循环,它从我的数据库中读取问题和答案,并将它们添加到列表中。我还有一个bool,它定义从数据库中选择的答案是正确的还是错误的。
我的问题是,当我的循环第一次执行代码并将true和false添加到布尔数组中时,所有这些都工作得很好,但第二次执行时抛出了异常:指定的强制转换无效。失败的方法如下所示:我在代码失败的地方做了一个注释:
public void GetQuestion(int categoryRef)
{
Console.Clear();
int arrayIndex = 0;
int qListIndex = 0;
int idListIndex = 0;
List<string> qList = new List<string>();
List<int> idList = new List<int>();
int ansNr = 1;
bool[] isTrue = new bool[3];
SQLiteDataReader sqReader;
SQLiteCommand sqCommand = new SQLiteCommand(sqConnection);
try
{
sqCommand.CommandText = "SELECT Question, ID FROM Questions WHERE CategoryRef=" + categoryRef.ToString();
sqCommand.Connection.Open();
sqReader = sqCommand.ExecuteReader();
foreach (var item in sqReader)
{
qList.Add(sqReader.GetString(0));
idList.Add(sqReader.GetInt32(1));
}
sqReader.Close();
}
finally
{
sqConnection.Close();
}
for (int i = 0; i < qList.Count; i++)
{
try
{
sqCommand.CommandText = "SELECT Answer FROM Answers WHERE QuestionRef=" + idList[idListIndex].ToString();
sqConnection.Open();
sqReader = sqCommand.ExecuteReader();
Console.WriteLine(qList[qListIndex]);
foreach (var answer in sqReader)
{
Console.WriteLine(ansNr + ":" + sqReader.GetString(0));
ansNr++;
}
sqReader.Close();
}
finally
{
sqConnection.Close();
}
try
{
//THIS CODE FAILS 2'nd TIME IT LOOPS THROUGH
sqCommand.CommandText = "SELECT IsTrue FROM Answers WHERE QuestionRef=" + idList[idListIndex].ToString();
sqConnection.Open();
sqReader = sqCommand.ExecuteReader();
foreach (var item in sqReader)
{
isTrue[arrayIndex] = sqReader.GetBoolean(0); //<-- Specified cast is not valid.
arrayIndex++;
}
sqReader.Close();
}
finally
{
sqConnection.Close();
}
string input = Console.ReadLine();
int number = Convert.ToInt32(input);
switch (number)
{
case 1:
if (isTrue[0] == true)
{
Console.WriteLine("Correct");
}
if (isTrue[0] == false)
{
Console.WriteLine("False");
}
break;
case 2:
if (isTrue[1] == true)
{
Console.WriteLine("Correct");
}
if (isTrue[1] == false)
{
Console.WriteLine("False");
}
break;
case 3:
if (isTrue[2] == true)
{
Console.WriteLine("Correct");
}
if (isTrue[2] == false)
{
Console.WriteLine("False");
}
break;
}
Console.ReadLine();
idListIndex++;
qListIndex++;
arrayIndex = 0;
ansNr = 1;
}
}发布于 2011-05-23 16:42:01
最有可能的情况是,您从数据库读取DbNull,而不能将其转换为bool。
发布于 2011-10-01 05:38:00
SQLite不保证任何列的内容都与强制转换匹配。
GetBoolean出现故障。你有3个选择。
SQLite version 3.7.8 2011-09-19 14:49:19
sqlite>创建表Q (A);
sqlite>插入Q值(0);
sqlite>插入Q值(1);
sqlite>插入Q值('T');
sqlite>插入Q值('F');
sqlite>插入Q值('Y');
sqlite>插入Q值(NULL);
sqlite> SELECT not ifnull(A==0 OR A=='F‘OR A=='N',1) FROM Q;
0
1
1
0
1
0
发布于 2017-01-31 23:20:08
在我的例子中,EF抛出了同样的错误(“指定的类型转换无效”),因为它不能解决SQLite抛给它的"1234“。

解决方案是将Name字段的类型从STRING更改为TEXT。
https://stackoverflow.com/questions/6094761
复制相似问题