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
、クエリは完全に正常に実行されます。私が目指しているのは、キーがフィールドの名前であり、値がそのフィールドの結果である辞書を作成することだけです。何が悪いのかについて何か考えはありますか?または、修正の過程で、このコードを簡単にする方法はありますか?