0

次のコードを使用して、データセットに存在するデータを削除しようとしています:

stateflowDataSet dsobject = new stateflowDataSet();
stateflowDataSetTableAdapters.dbo_statetableTableAdapter statetableadapter = new         stateflowDataSetTableAdapters.dbo_statetableTableAdapter();
statetableadapter.Fill(dsobject.dbo_statetable);
dsobject.dbo_statetable.Clear();
statetableadapter.Update(dsobject);

ただし、この行を使用するstatetableadapter.Fill(dsobject.dbo_statetable);と、データは引き続き保持されます。

データを消去する方法は正しいですか?

コードに他の問題はありますか?

4

2 に答える 2

3

DataRowsから削除DataTableしても、それらを DBMS から削除するわけではありません。反対のことが当てはまります。実際には、以前に呼び出したとしても、それらが削除されるのを防いでいますDataRow.Delete()

その理由は:DataRowsに属するものだけDataTableが削除できるからです。

DataAdapter.Update(table)

これにより、テーブル内のすべての行が削除されますDataRowState=DeletedDeleteそのため、メソッドを使用する必要があります。

foreach(DataRow row in dsobject.dbo_statetable.Rows)
{
    row.Delete();
}
statetableadapter.Update(dsobject.dbo_statetable);

より効率的な 1 つのバッチでも実行できます。そのため、DataAdapterUpdateBatchSizeを 0 (無制限) に設定する必要があります。

すべての行を削除する別の方法はSqlCommand、 CommandTextでシンプルを使用することDELETE FROM Tableです。

using(var con = new SqlConnection(ConfigurationSettings.AppSettings["con"]))
using(var cmd = new SqlCommand())
{
    cmd.CommandText = "DELETE FROM Table";
    cmd.Connection = con;
    con.Open();
    int numberDeleted = cmd.ExecuteNonQuery();  // all rows deleted
}

データベースでDataTableも手動で行を削除したため、行を手動で削除する必要があります(削除ではなく、質問の核心は何ですか) 。

dsobject.dbo_statetable.Clear();
于 2012-06-21T11:09:28.457 に答える
2

ティムの答えを少し言い換えてみます。DataSet人気の頃はよく使っていたので、「魔法」と混同してしまいました…

Datasetデータベースからのデータのコピーと、データがデータベースからフェッチされるためのデータの更新が含まれています。

Update()データセットでのメソッドDataAdapterは魔法ではありません。データセット内のテーブルを通過し、テーブル内で行をスキャンします。そうなる:

  • DeleteCommand行が削除対象としてマークされている場合に使用
  • UpdateCommand行が更新用にマークされている場合に使用

前者はメソッドで行を削除する場合Delete()で、後者は行内のセルを更新する場合です。

RowStateデータセット テーブルの各行のプロパティを観察すると、プロセスについて多くのことがわかります。

于 2012-06-21T11:16:14.603 に答える