3

これがDataGridViewの基本的な機能であることは知っていますが、何らかの理由で機能させることができません。ユーザーが[保存]ボタンをクリックしたときに、WindowsフォームのDataGridViewに加えられた変更をデータベースに送信させたいだけです。

次のように、DropDownListでのユーザー選択によってトリガーされる関数に従ってDataGridViewにデータを入力します。

using (SqlConnection con = new SqlConnection(conString))
{
    con.Open();
    SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife], rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix] FROM   dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con);
    DataSet ruleTableDS = new DataSet();
    ruleTableDA.Fill(ruleTableDS);
    RuleTable.DataSource = ruleTableDS.Tables[0];
}

私の保存関数には、基本的に次のものがあります(要点をつかむために、その周りのコードの一部を削除しました)。

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }

さて、コードを編集して次のようにしました。コマンドをビルドし、DataGridView(RuleTable)に基づいてDataTableを作成し、DataAdapterにDataTableを入力して、データベースを更新します。現在、ruleTableDA.Update(dt)は、「同時実行違反:UpdateCommandが予想される1レコードのうち0に影響を与えました」という例外をスローしています。

4

3 に答える 3

5

ここにはいくつかの問題があると思います。覚えておくべき順序は、グリッドをロードするときに、すでにデータテーブル/セットを指しているということです。グリッドに入力すると、変更はグリッドにバインドされているデータテーブルに一時的に保持されます。したがって、既存のデータテーブルに加えられた変更は無視されるため、保存するたびにデータテーブルを作成する必要はありません。2番目の問題は、おそらく毎回バインディングソースを作成する必要がないことです。これは、最初のポイントと同様に、グリッドにデータが表示されている場合、それがバインドされているバインディングソースがすでに存在するためです。3番目の問題は、SQLCommandBuilderクラスにGetInsertCommand、GetUpdateCommandなどのメソッドがあり、実際に適切なコマンドを取得するために使用する必要があることです。

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        //ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }
于 2010-04-12T17:13:56.053 に答える
2

MSDNのドキュメントには、SelectCommandを手動で設定すると、更新/削除/挿入コマンドが自動的に設定されると記載されています。SqlDataAdapterを使用して構築する場合も同じことを行うとは述べていません。SqlCommanduBuilderを作成した後、これらの行を追加してみてください。

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand()
ruleTableDA.InsertCommand = commandBuilder.GetInsertCommand()
ruleTableDA.DeleteCommand = commandBuilder.GetDeleteCommand()
于 2010-04-12T17:19:04.913 に答える
0

更新コマンドを取得するためにこれが必要になる場合があります

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand();
于 2010-04-12T17:23:16.977 に答える