我正在将DataGridView控件与DataTable结合使用来编辑SQL表。我有两个表的字段是Checkboxes绑定到名为bit not null
和acoustic
的{{1}} SQL列。当我添加新行并取消选中hud
列时,我会收到以下错误消息。我将hud
列设置为什么并不重要。如果我检查acoustic
列,但未选中hud
列,则可以正常使用。
无法将值NULL插入列'hud',表'rawVinyl';列不允许空值。 INSERT失败。
该表的定义是:
acoustic
这是设计器为我遇到问题的复选框生成的代码。 CREATE TABLE rawVinyl
(
storesId nvarchar(12) NOT NULL,
baseColor nvarchar(50) NOT NULL,
shadeColor nvarchar(50) NULL,
rollWidth float NOT NULL,
shadeHeight float NULL,
acoustic bit NOT NULL,
hud bit NOT NULL
)
列的代码与更改的名称完全相同。
acoustic
填充DataGridView的代码是
private System.Windows.Forms.DataGridViewCheckBoxColumn hud;
...
this.hud = new System.Windows.Forms.DataGridViewCheckBoxColumn();
...
this.hud.DataPropertyName = "hud";
this.hud.HeaderText = "H.U.D.";
this.hud.Name = "hud";
this.hud.Width = 46;
最后但并非最不重要的是,保存更改的代码是:
private const string selectQuery = "SELECT storesId, baseColor, shadeColor, rollWidth, shadeHeight, acoustic, hud FROM rawVinyl ORDER BY storesId";
...
DataTable tbl = new DataTable();
using( SqlDataAdapter data = new SqlDataAdapter(selectQuery, Global.ConnectionString) )
{
data.Fill(tbl);
bindingSource1.DataSource = tbl;
}
我还尝试按如下方式设置Checkbox列的默认值,但它没有区别:
DataTable tbl = bindingSource1.DataSource as DataTable;
DataTable changes = tbl.GetChanges();
if( changes != null )
{
using( SqlDataAdapter sda = new SqlDataAdapter(selectQuery,Global.ConnectionString) )
using( SqlCommandBuilder scb = new SqlCommandBuilder(sda) )
{
sda.UpdateBatchSize = 0; // do it all at once.
sda.Update(changes);
tbl.AcceptChanges();
}
}
我不明白的主要原因是我为什么不在this.hud.FalseValue = false;
this.hud.IndeterminateValue = false;
this.hud.TrueValue = true;
列中遇到此问题?
答案 0 :(得分:1)
You can set DataColumn.DefaultValue of acoustic
and hud
.
tbl.Columns["acoustic"].DefaultValue = false;
tbl.Columns["hud"].DefaultValue = false;
Maybe in SQL server you have already set acoustic
default value so the error appears only for hud
field.