1

SQLDataAdapter があります。クエリで、ID(PK)、名前の 2 つのフィールドを取得しています。

SQL コマンド ビルダーをデータ アダプターに登録したので、データベース内のテーブルを更新するためにクエリを記述する必要はありません。

メソッドを呼び出すとda.update()、sql が DimensionID に null を挿入できないというエラーをスローします。このエラーのため、データセットでもこのフィールドを選択する必要があり、グリッドにこのフィールドを適切な値で入力します。その後da.update()働いた。

問題は、このフィールドを自分のグリッドに表示したくないということです.visibleプロパティをfalseに設定すると、コマンドビルダーはクエリでこの列を省略します. この問題に対応するには、列幅を 0 に設定する必要がありますが、グリッドにはまだ小さな線が残っています。

この状況を処理するより良い方法はありますか? ただし、手動でクエリを作成します。

以下は、グリッドを設定するコードです。

 private void frmAttributes_Load(object sender, EventArgs e)
    {
        ds.Tables.Add("Attributes");
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        cmd.CommandText = "select ID,Attribute,Code,DimensionID from DimensionAttribute where dimensionid = " + SelectedAttribute;
        da.SelectCommand = cmd;
        cb.DataAdapter = da;

        da.Fill(ds,"Attributes");

        this.dgvAttributes.DataSource = ds.Tables["Attributes"];
        this.dgvAttributes.Columns["ID"].Visible = false;
        this.dgvAttributes.Columns["DimensionID"].Width = 0;







    }

更新されたボタンの背後にあるコードは次のとおりです。

 private void btnOk_Click(object sender, EventArgs e)
    {

        if (ds.HasChanges())
        {
            DialogResult d = new DialogResult();
            d = MessageBox.Show("Are you sure you want to save changes to database?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (d == DialogResult.Yes)
            {
                try
                {
                    fillDimensionID();
                  da.UpdateCommand =  cb.GetUpdateCommand();
                    da.InsertCommand = cb.GetInsertCommand();
                    da.DeleteCommand = cb.GetDeleteCommand();

                    da.Update(ds,"Attributes");

                    this.DialogResult = DialogResult.OK;
                    this.Close();




                }
                catch (Exception)
                {

                    throw;
                }


            }
            else
            {
                return;
            }


        }


    }
4

1 に答える 1

0

これは AutoGeneratedCommands の問題です。更新がトリガーされる前に、すべての属性に適切な値が割り当てられている必要があります。

次のいずれかを採用できます。

  1. null 値を受け入れるように列 DimensionID を変更します。また

  2. 独自の更新 SP をデータベースに書き込み、それを UpdateCommand としてデータ アダプターに登録します。

これがあなたに道を示すことを願っています。

于 2013-03-21T08:01:07.400 に答える