1

我有一个 SQLDataAdapter,在我的查询中我获取两个字段,ID(PK),名称。

我向我的数据适配器注册了一个 sql 命令生成器,因此我不必编写查询来更新数据库中的表。

当我调用该da.update()方法时,sql 会抛出无法将 null 插入 DimensionID 的错误,由于此错误,我必须在我的数据集中也选择此字段,然后我在网格中使用适当的值填充此字段。然后da.update()工作。

现在的问题是我不希望这个字段出现在我的网格中,当我将其可见属性设置为 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. 修改列 DimensionID 以接受空值;或者

  2. 在数据库中编写您自己的更新 SP 并将其注册为 UpdateCommand 与您的数据适配器。

希望这会告诉你路径。

于 2013-03-21T08:01:07.400 回答