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;
}
}
}