2016-07-16 7 views
0

クロスカントリーのタイマープロジェクトの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" 

の列と一致していない見つけ

答えて

0

にエイリアス名を使用する必要はありませんおかげで助けてください。 (私の場合)過熱を減らすために読んでいる間、いくつかの基本的なSQLルール(どのような種類が正確かわかりません)を省略するので、SQLiteCommandを使用することはできません。

私のような複雑なクエリの場合、 SQLiteDataAdapterは正常に動作します。

private static DataTable ExecuteTableQuery(String Query) 
{ 
    using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(Query, CONNECTION)) 
    { 
     DataTable dt = new DataTable(); 
     adapter.Fill(dt); 
     return dt; 
    } 
} 
-1

は、それが自然ですか?

またはそれは次のようになります。

SELECT NULL AS "No. Arrived" , 
    NULL AS "Status", 
    NULL AS "Time", 
    NULL AS "Time Total", 
    `Runner_no` AS "No. Runner" 

......あなたは問題がDataTbleロードであってもよいように、SQLステートメントは、あなたに期待される結果が得られることが確実な場合

私はお勧め:

はDataTbleに名前を-give:

DataTable dt =新しいDataTable( "MyTable");外側のSQLにスペースまたはドットなし

使用別名を[A]:

SELECT号」、time_totalとして "時間の合計"、 "時間"、no_arrived、 "ステータス" と "いいえ到着しました"no_runnerとしてランナー」 - !のための[A]

ところで、あなたは外SQL [A]にエイリアス名を使用している場合、あなたは内側のSQL私は私の答えを得た

+0

もし私の答えがsati答えてください –

関連する問題