2

我的 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 会抛出错误“没有选择当前行。”。

我对此完全迷失了,我不知道出了什么问题,因为我与其他数据库文件的其余 SQLite 连接工作正常。我已经在 中测试了我的查询SQLite Administrator,并且我的查询执行得非常好。我的目标是最终得到一个字典,其中键是字段的名称,值是所述字段的结果。关于有什么问题的任何想法?或者,在修复它的过程中,有没有办法让这段代码更简单?

4

3 回答 3

4

解决了。出于某种原因,使用.GetString(0).GetString(i)正在破坏它。但是,当我把它变成.GetValue(0).ToString()它时,它工作得很好。我不知道为什么会这样,它超出了我的范围,但它确实有效。

于 2012-06-24T03:29:32.340 回答
0

这是因为GetValue(0)没有返回字符串。

将其转换为字符串允许您将其添加到Dictionary<string,string>.

于 2012-06-24T03:32:52.760 回答
0

我有一个类似的问题,在我的情况下,表格是空的,我要求某个列的 MAX() 。我通过首先检查 COUNT(*) 不是 0 来解决它。

于 2014-02-07T09:50:41.573 回答