2

少し長くなるかもしれませんが、ご容赦ください。高低を検索しましたが、特定の問題について明確な答えが見つからないようです。

上記の件名で述べているようDataSetに、データベース内のレコードを取得、編集、挿入、および更新するために s を使用しています。ただし、挿入を除く他のすべての機能は期待どおりに機能します。何が起こるかというと、新しいレコードをデータセットに挿入すると、監視機能を使用してデータセット内の新しいレコードを確認できるため、すべて問題ないように見えます。しかし、編集を終了し、変更を受け入れて更新を行った後、1 つのレコードのみがデータベースに送信されます。以下のコードを参照してください。私もいくつかのバインディングを使用しています。

SetAdapaterCommandsコードは、FillDataSets、 、SendToDatabaseおよびのように異なる関数に分割されますBindToUI。誰でも何か間違ったことを見ることができますか?

または、データセットの挿入および更新コマンドがどのように機能するかについて、私が見逃しているものはありますか?

このテーブルの前に別の親テーブルを更新していると言うべきかもしれません。それが何か関係があるかどうかはわかりません。

セット アダプタ コマンドの開始

コマンドを選択

#region Select Task Command
queryString = "SELECT value1, value2, value3 FROM Table1;";

taskCommand = new SqlCommand(queryString, connection);
#endregion Select Task Command

更新コマンド

#region Update Task Command
queryString = "UPDATE Table1 SET value1 = @value1, value2 = @value2, value3 = @value3" +
              "WHERE value1 = @value1;";

taskUpdateCommand = new SqlCommand(queryString, connection);

taskUpdateCommand.Parameters.Add("@value1", SqlDbType.Char, 10, "value1");
taskUpdateCommand.Parameters.Add("@value2", SqlDbType.Char, 10, "value2");
taskUpdateCommand.Parameters.Add("@value3", SqlDbType.VarChar, 50, "value3");

taskAdapter.UpdateCommand = taskUpdateCommand;

SqlParameter taskParameter = taskUpdateCommand.Parameters.Add("@oldValue1", SqlDbType.Char, 10, "value1");
taskParameter.SourceVersion = DataRowVersion.Original;
#endregion Update Task Command

コマンドを挿入

#region Insert Task Command
queryString = "INSERT INTO Table1 (value1, value2, value3) " +
              "VALUES (@value1, @value2, @value3);";

taskInsertCommand = new SqlCommand(queryString, connection);

taskInsertCommand.Parameters.Add("@value1", SqlDbType.Char, 10, "value1");
taskInsertCommand.Parameters.Add("@value2", SqlDbType.Char, 10, "value2");
taskInsertCommand.Parameters.Add("@value3", SqlDbType.VarChar, 50, "value3");            

taskAdapter.InsertCommand = taskInsertCommand;
#endregion Insert Task Command

セット アダプタ コマンドの終了

データセットを埋める

private void loadFromDatabase()
{
    #region Load Data and From Database 
    SetAdapterCommands();

    #region Load Tasks
    try
    {
        connection.Open();
        taskAdapter.SelectCommand = taskCommand;
        taskAdapter.Fill(Table1DataSet);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    #endregion Load Tasks
}

変更をデータベースに送信する

private void updateDatabase()
{
    try
    {
        Table1BindingSource.EndEdit();
        Table1DataSet.AcceptChanges();
        taskAdapter.Update(Table1DataSet);
    }
    catch(System.Exception ex)
    {
        MessageBox.Show("Update Failed");
    }
}

UI にバインド

textBoxValue1.DataBindings.Add("Text", Table1BindingSource, "value1");
textBoxValue2.DataBindings.Add("Text", Table1BindingSource, "value2");
textBoxValue3.DataBindings.Add("Text", Table1BindingSource, "value3");
4

1 に答える 1

4

これはよくある間違いです。データセット。AcceptChangesは、DataSet のすべての DataTable 内のすべての DataRowのRowStateを値DataRowState.Unchangedに変更します。

したがってAcceptChanges、次の呼び出しを呼び出すと、Update更新、削除、または挿入する行が見つかりません。

への呼び出しを削除するだけですAcceptChanges

背景を少々。行を編集すると、その行RowStateは次のように変更されますDataRowState.Modified(挿入の場合はDataRowState.Added、削除された行の場合はDataRowState.Deleted)

DataAdapter の Update 呼び出しは、これらの状態の行を検索して、相対的な UPDATE/INSERT/DELETE を準備し、データストアに送信します。

AcceptChanges は紛らわしい名前で、Update を送信する前にこの呼び出しが必要だと多くの人が考えていると思いますが、それはまったく逆です。

于 2016-07-01T16:05:51.127 に答える