0

次のように行がデータセットから削除された後、データベースを更新しようとしています。

SqlCommand mySelectCommand = new SqlCommand("select * from NameDB", c);
                SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(mySelectCommand);
                TheNewDataSet ds = new TheNewDataSet();
mySqlDataAdapter.Fill(ds, "NameDB");
DataRow[] FilteredRow = ds.Tables["NameDB"].Select("PName like '" + listBox2.SelectedValue.ToString() + "'");
                foreach (DataRow drr in FilteredRow)
                {
                    ds.Tables["NameDB"].Rows.Remove(drr);
                }
                mySqlDataAdapter.Update(ds, "NameDB");
                c.Close();

そして、データベースには何も起こらず、行は削除されませんでした。デバッガーによると、行は正しくフィルタリングされ、DataSetから正常に削除されます。間違いはどこにありますか?

4

3 に答える 3

0

わかりました。まず、更新を行うのはデータセットではありません。決して。アダプターです。DataSetはデータベースと通信しません。

しかし:あなたは行を削除しないでください、あなたは-それらを殺します(rows.remove)。

http://msdn.microsoft.com/en-us/library/feh3ed13(v=vs.80).aspx

REMOVEではなくDELETEを使用する必要があります。これにより、行を削除するステータスが保持されます。あなたがそれをする方法であなたはそれを取り除くので、アダプターはそれを決して見ません。「.Delete」を使用すると、アダプターは行が削除されたと見なすため、それに基づいて動作できます。

于 2013-01-04T20:42:36.890 に答える
0

sqldataadapterに挿入/更新/削除コマンドがないようですか?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand.aspx

于 2013-01-04T20:39:39.477 に答える
0

私は今日仕事で同様の問題に遭遇したので、私が理解したことに答えたいと思います。これは将来、私だけでなく他の人にも役立つかもしれません。

今日私が理解したことから、.Removeはグリッドから視覚的に行を取得しますが、データベースに変更を保存するためにAcceptChangesを実行するときに、それらを削除する行としてマークしません。TomTomが述べたように、代わりに.Deleteを使用する必要があります。これにより、永続化するときに削除する必要がある行としてそれらの行がマークされます。プログラムをデバッグし、ビジュアライザー(?)でデータセットを確認すると、違いがわかります。私が正しければ、.Deleteには感嘆符が付いた行が表示され、.Removeは削除するだけだと思います。

于 2013-12-11T01:39:19.297 に答える