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は「列挙は結果を生成しませんでした」と言います。しかし、彼らは前にそこにいましたか?

そこで、2番目のループを試しました。を実行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 に答える