我的C#类中有一个方法,它从SQLite数据库中调用一个结果。我的数据库连接打开成功,但在不同的地方运行断点后,我注意到一些奇怪的事情。这是我的代码:
Dictionary<string, string> getResult(string id)
{
dataConn.Open();
SQLiteCommand comm = dataConn.CreateCommand();
comm.CommandText = "SELECT * FROM [tableName] WHERE id='" + id + "'";
SQLiteDataReader result = comm.ExecuteReader();
Dictionary<string, string> resultDict = new Dictionary<string, string>();
/*
This doesn't work.
while(result.Read())
{
resultDict.Add(result.GetName(0), result.GetString(0));
}
*/
result.Read();
for (int i = 0; i < result.FieldCount; i++)
{
resultDict.Add(result.GetName(i), result.GetString(i));
}
result.Dispose();
comm.Dispose();
dataConn.Close();
return resultDict;
}
我知道我可以使用SQLiteParameters
而不是内联串联,但由于某种原因,它们会破坏我的查询。
在我的第一个循环中,如果我在它开始之前放置一个断点,我可以看到我的查询返回了一个结果,正是我需要的。但是,当我进入循环时,在执行除reader.Read()
以外的任何代码之前,VS2010说“枚举没有产生任何结果”。但他们之前就在那里?
所以,我尝试了第二个循环。执行reader.Read()
,然后循环返回的字段。当我这样做时,VS2010会抛出错误“No current row selected。”。
我完全迷失了这个,我不知道出了什么问题,因为我的SQLite其他数据库文件连接工作正常。我在SQLite Administrator
中测试了我的查询,我的查询执行得非常好。我的目标是最终得到一个字典,其中键是字段的名称,值是所述字段的结果。关于什么是错的任何想法?或者,有没有办法在修复它的过程中使这段代码更简单?
答案 0 :(得分:4)
解决。出于某种原因,使用.GetString(0)
或.GetString(i)
会破坏它。但是,当我把它变成.GetValue(0).ToString()
时,它工作得很好。我不知道为什么会这样,它超出了我的范围,但它确实有效。
答案 1 :(得分:0)
因为GetValue(0)
没有返回字符串。
将其投射到字符串后,您可以将其添加到Dictionary<string,string>
。
答案 2 :(得分:0)
我有一个类似的问题,在我的情况下,表是空的,我要求一些collumn的MAX()。我通过首先检查COUNT(*)不是0来解决它。