18

それで、私は先週これを機能させました。少なくとも、私はそう思った! DataGridView の更新

それから私は今日再びプロジェクトに取り組み始め、

変更された行を含む DataRow コレクションを渡す場合、更新には有効な UpdateCommand が必要です。

の上

scDB.SSIS_Configurations_StagingDataTable table = (scDB.SSIS_Configurations_StagingDataTable)stagingGrid.DataSource;
myStagingTableAdapter.Update(table);

StagingTableAdapterは、「フィルター」をパラメーターとして受け取る追加のクエリがあります。それは を埋めるために使用されましたDataGridView。そのクエリを作成するためのウィザードで、「更新が生成されました」と表示されます。このエラーを含むほとんどの投稿では、コマンド ビルダーを使用して update ステートメントを生成する必要があることがわかります。私は何をしますか?

4

11 に答える 11

29

このメッセージは、更新するテーブルに主キーが定義されていない場合にも表示されます。

于 2011-06-13T17:05:22.170 に答える
17

私はサムと同じ問題に遭遇しました。突然機能しなくなったコードが機能していました。いつ書いたのかわかりませんでしたが、自動的に更新コマンドを推測して停止していたに違いありません。おそらく、私たちが気づかなかったバージョン間のMSからのサービスパックです。とにかく、私が遭遇した解決策は、(私の場合はoracleの場合)OracleCommandBuilderを使用して、(fillを呼び出した後の)DataAdapterをコンストラクターへのパラメーターとして受け取り、GetUpdateCommand()を呼び出して、それをDataAdapterのUpdateCommandに割り当てることです。

pseudocode:

DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand();
...
da.Update();
于 2009-07-30T21:15:32.837 に答える
9

エラーは文字通りです。アダプタには有効な SQL Update ステートメントが必要です。データセット デザイナーと CommandBuilders がこれらを生成しますが、少し SQL を手作りしても問題はありません。

とにかく、 Update ステートメントがまだ構成されていることと、それが実際に何であるかを (デバッガーで) 確認する必要があります。これは、C# の問題というよりも SQL の問題である可能性があります。

編集: Command Builder ツールは、ストレートな単一テーブルの Select ステートメントのみを処理します。結合または空想的なものを使用すると、自分でできます。

于 2009-02-25T23:42:33.793 に答える
8

Dan の回避策はうまくいきますが、OracleCommandBuilder の代わりに SqlCommandBuilder を使用できます。

DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();
...
da.Update();
于 2011-05-15T14:56:33.770 に答える
1

主キーで定義された列フィールドが常に必要です。そうでなければ、問題は常に存在します。主キー フィールドがない場合、SqlCommandBuilder は役に立ちません。

于 2016-12-20T08:15:03.200 に答える
0

ページから:

注メインクエリに十分な情報がある場合、TableAdapterの生成時に、デフォルトでInsertCommand、UpdateCommand、およびDeleteCommandコマンドが作成されます。TableAdapterのメインクエリが複数のテーブルSELECTステートメントである場合、設計者はInsertCommand、UpdateCommand、およびDeleteCommandを生成できない可能性があります。これらのコマンドが生成されない場合、TableAdapter.Updateメソッドの実行時にエラーが発生する可能性があります。

したがって、私が言えることから、これらのステートメントは生成されているはずです。私は単一のテーブルを使用しています。

于 2009-02-26T17:56:40.590 に答える
0

私も同じ問題に直面し、次の解決策を得ました。それを試してみてください。

private void btnSave_Click(object sender, EventArgs e)
{
    ConnStr = "Data Source=FIN03;Initial Catalog=CmsTest;Integrated Security=True";
    cn = new SqlConnection(ConnStr);
    cn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    mytran = cn.BeginTransaction(IsolationLevel.Serializable );

    cmd.Transaction = mytran;
    try
    {

        scb = new SqlCommandBuilder(da);
        da.Update(ds, "tblworker");
        mytran.Commit ();
        MessageBox.Show("Data update successfully"); 

    }
    catch (Exception err)
    {

           mytran.Rollback();

            MessageBox.Show(err.Message.ToString());           
    }
}
于 2015-02-24T13:00:18.400 に答える