2012-02-28 3 views
1

私はsqlite dbに対して実行しようとしているSQL文を持っています。5行を返すリーダー、データテーブルは1です

問題は、この1つのSQL文だけで、データテーブルは1行、イベントですが、読者を見ると結果ビューに5行あります。

SQL:

 var dt = new DataTable(); 

     try 
     { 
      var com = new SQLiteCommand(_con) { CommandText = sql }; 
      var reader = com.ExecuteReader(); 
      dt.Load(reader); 
      reader.Close(); 
     } 
     catch 
     { 
     } 

     return dt; 
+0

SQLクライアントを使用してこのSQL文を直接実行すると、1行になりますが、コードを使用すると5文字になります。彼らは同じ5行ですか? –

+0

nope。 SQLブラウザーで実行すると、5が返されます。reader.resultsviewには5つのオブジェクトがあります。 dt.load(リーダー);現在dtには1行が含まれています。完全性のために – Bluebaron

+0

、dtをインスタンス化する場所を追加できますか? –

答えて

2

問題は、MSDNの記事に記載されているようにデータテーブルの充填方法は、主キーと一致する各行を上書きしていることです。 それが本当であれば、最後の行だけが返されることを知っていました。私は戻って、私のコードの変更をすべて元に戻し、十分に、最後の行だけが返されました。これは、データテーブルにロードされた各ローが以前にそのローを上書きしたためです。 この問題が発生していて、解像度がなくなってから4年も経っているスレッドの中には、ある特定の列のすべての値が同じであるかどうかを確認するための停止、 Datatablesはおそらくその列でデータをキー入力します。

0

ご参加のホストへのスキャンとlogged_on_usersにホストをフィルター付きテーブルが複数の行を生成している場合は、logged_on_usersでフィルタ:

SELECT 
    f.host_id,h.hostname,h.computer_name_dns_fully_qualified, 
    l.username,l.logon_domain 
FROM scans s 
LEFT JOIN hosts h ON h.scan_id=s.scan_id 
LEFT JOIN logged_on_users l ON l.host_id=h.host_id 
LEFT JOIN hosts f ON f.computer_name_netbios LIKE l.logon_ser... 

これは、呼ばれています方法ですあなたはデカルト乗法を得るでしょう。

クエリの一部をサブクエリに分割してみてください。

また、これがSQL Serverの場合は、ビジネススタジオにクエリプランを依頼してください。画像として投稿すると、わかりやすく答えることができます。それは、このような問題につながるので、

おかげ サイモン

+0

Nope。デカルト結合問題ではありません。 SQL文に問題があった場合は、読者とSQLクライアントで5行を取得することはできません。 – Bluebaron

+0

Bluebaronのコメントを正しく理解していれば、問題は、SQL – Aprillion

+0

が返す5行ではなく、変数 'dt'で1行を持つことです。 SQLは5行を戻しています。 dt.loadが正しく動作していません。 – Bluebaron

0

は空のcatchブロックを避けてください。代わりに、例外を記録し、例外をスローします。 http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

Load方法がロードIDataReaderから最初の結果セットを消費し、もしあれば成功完了した後、次の結果セットにリーダーの位置を設定します。

明らかに例外があるため、DataTableには1つの行しか表示されません。したがって、何が起こるかを見るためにブレークポイントを設定する必要があります。

例外がある場合は、finally -block(またはusingステートメントを使用)に属している場合も、接続を閉じることはありません。

+0

はい、x行数と表示されます。これは、これ以外のすべてのリクエストで正しく発生します。 – Bluebaron

+0

_x_行数の行がありますか?明らかに例外があるので、何が起こるかを見るためにブレークポイントを設定する必要があります。また、finnally-blockに属する例外がある場合(または 'using'文を使用して)、接続を閉じることもありません。 –

+0

dt.rows.count意志は言うことは言う1.他のクエリ24、1061、40、等 – Bluebaron

1

クエリにオーダーを追加します。 DataTablesには、作業するための固有のフィールドが必要です。データセットは、その中にリーダーをロードすることによってコンテンツを更新することができる。

参照:Similar Issue

+0

私はあなたのコメントを上げてもらうつもりですが、人々がこの問題を理解してもらいたいという希望で私自身の解決策を投稿します。問題は、すべての行が同じ主キーを戻していたことです。 – Bluebaron

関連する問題