クロスカントリーのタイマープロジェクトのC#でSQLiteクエリジェネレータを作成しています。コンボボックスで選択した情報に従ってクエリを生成します。私のプロジェクトの当初から DataGridViewでDataTableを読み込むと、SQLクエリのデータが変更されます
、私は私のDataGridViewのフォームのデータソースを設定するために、以下の機能private static DataTable ExecuteTableQuery(String query)
{
DataTable dt = new DataTable();
using (SQLiteCommand cmd = new SQLiteCommand(query, CONNECTION))
{
SQLiteDataReader reader = cmd.ExecuteReader();
dt.Load(reader);
return dt;
}
}
を使用してきました。
しかし、生成されるクエリが複雑になればなるほど、私は奇妙な状況に遭遇し始めました。
クエリ例:
SELECT "No. Arrived", "Status", "Time", "Time Total", "No. Runner" // [A]
FROM (
SELECT `Runner_no` AS "No. Runner", // Runner_no is a PK
`Result_time` AS "Time",
`Result_totaltime` AS "Time Total",
`Result_status` AS "Status",
`Result_registered` AS "No. Arrived" // Result_registered is a PK
// [B]
FROM `Result`, `Runner`, `City`
WHERE `Runner_City_id` = `City_id` // City_id is a PK
AND `Result_id` = `Runner_no`
AND (`Runner_gender` = "F" OR `Runner_gender` = "M")
AND (`Result_status` = "hurt" OR `Result_status` = "disq" OR `Result_status` = "OK")
UNION // Some people may have not reached the finish line.
SELECT `Runner_no` AS "No. Runner",
NULL AS "Time",
NULL AS "Time Total",
NULL AS "Status",
NULL AS "No. Arrived"
FROM `Result`, `Runner`, `City`
WHERE `Runner_City_id` = `City_id`
AND `Runner_no` NOT IN (SELECT `Result_id` FROM `Result`)
AND (`Runner_gender` = "F" OR `Runner_gender` = "M")
GROUP BY "Runner_no"
)
ORDER BY "No. Arrived" ASC
は、私のアプリケーションが私の例を見てsimplifiableすることが通常であるように可変SQLクエリを生成するために作られていることに注意してください。
私の問題:、(私は思う)私の生成クエリが(私の例のように)いくつかの句で主キーを備えていたときに、いくつかの結果が省略されている時間のほとんどは、順序を無視しますと、時々、別の行を選択します[A]を押すとクエリが再び機能するようになります。私の例では
:No. Arrived
列がいくつかの行が消えて、[A]と[B]解決し、すべてに列City_id
を追加し、注文されません。
NOTA BENE:私のアプリケーションで生成されたクエリには何もエラーはありません。外部のSQLiteソフトウェア(例:http://sqlitebrowser.org/)で実行すると常に成功します。
私の質問: DataTableにデータをロードすると、どうしてですか?どうすればこれを避けることができますか? SQLiteBrowserのようなC++ベースのソフトウェアを使用して得られる結果と同じ結果をC#で得るにはどうすればよいですか?私はあなたのunion文の列は、[A]
SELECT `Runner_no` AS "No. Runner",
NULL AS "Time",
NULL AS "Time Total",
NULL AS "Status",
NULL AS "No. Arrived"
の列と一致していない見つけ
もし私の答えがsati答えてください –