2017-08-10 28 views
0

SQL ServerデータベースからDatatableにデータを読み取るときに問題が発生しています。私はDataGridViewのデータソースとしてDatatableを使用しており、次のコードを使用してSQL Serverテーブルからデータテーブルを埋めます。このコードは10秒ごとに実行され、結果が更新されたままになり、行が変更または追加されたとき(プログラムの別のインスタンスまたはssmsから直接)は正常に動作しますが、データベースから行が削除されたときにデータテーブルに残ります。例えばDatatable.Loadで削除された行が削除されない

、私は当初、次のクエリでテーブルをロードする場合:

SELECT TOP 10 * 
FROM Table 

、その後のDataTableはまだ10行を持っているでしょう

SELECT TOP 5 * 
FROM Table 

でそれをロードします。

私はすべてLoadOptions(Upsert、OverwriteChangesおよびPreserveChanges)の同じ結果を試しました。

私が見つけた唯一の解決策は、ロードする前にdatatable.Rows.Clear()に電話することですが、それ以外の問題が発生します。

using (SqlConnection con = new SqlConnection(_connectionString)) 
using (SqlCommand command = new SqlCommand(query, con)) 
{ 
    con.Open(); 

    using (SqlDataReader reader=command.ExecuteReader()) 
    { 
     dt.Load(reader); 
    } 

    con.Close(); 
} 

どうすればこの問題を解決できますか?

+0

は、あなただけの新しいデータテーブルを作成することができます。

using (SqlDataReader reader=command.ExecuteReader()) { dt.Load(reader); } 

のように見えることはできますか? dt = new DataTable(); – msmucker0527

+0

それから、私はdatagridviewのデータソースをリセットする必要があります。それは正しいように見えた。それは大丈夫なので、私はそれを試してみましょう。 –

+0

datagridviewのデータソースをいずれかの方法でリセットする必要があります – msmucker0527

答えて

0

これはisueではありません。これはそのように機能します。

MSDNから供給 たIDataReaderを使用して、データソースからの値を使用してDataTableを設定し。 DataTableに既に行が含まれている場合、データソースからの受信データ が既存の行と結合されます。

Restetメソッドで新しいデータテーブルを作成したり、既存のデータを消去することができます。

DataTableを元の状態にリセットします。リセットは、テーブルのすべてのデータ、 インデックス、リレーションおよび列を削除します。 DataSetに DataTableが含まれている場合、テーブル がリセットされた後も、そのテーブルは引き続きDataSetの一部になります。

だからあなたのコード:

using (SqlDataReader reader=command.ExecuteReader()) 
{ 
    dt.Reset(); 
    dt.Load(reader); 
} 
+0

私が提案したようにReset()を追加し、アプリケーションがデバッグモードで実行されていても奇妙なメッセージボックス例外が表示されました。そのメッセージは指数範囲外です。おそらく、データグリッドビューにそのデータソースとしてのデータテーブルがあるからですか? –

関連する問題