无法使用DataGridView和DataTable插入Null值

本文关键字:DataTable 插入 Null DataGridView | 更新日期: 2023-09-27 18:16:04

我使用DataGridView控件与DataTable结合来编辑SQL表。我有两个字段的表是复选框绑定到名为acoustichudbit not null SQL列。当我添加新行并未选中hud列时,我得到了下面的错误。我将acoustic列设置为什么并不重要。如果我检查hud列,但不检查acoustic列,它工作得很好。

不能插入NULL值到列'hud',表'rawVinyl';列不允许为空。插入失败。

表的定义是:

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列的代码与更改名称后的代码完全相同。

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;

填充DataGridView的代码是

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

最后,保存更改的代码是:

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

我也试着为Checkbox列设置如下的默认值,但是没有一点区别:

this.hud.FalseValue = false;
this.hud.IndeterminateValue = false;
this.hud.TrueValue = true;

我不明白的主要事情是为什么我没有这个问题与acoustic列?

无法使用DataGridView和DataTable插入Null值

可以设置dataccolumn。

acoustichud的默认值。
tbl.Columns["acoustic"].DefaultValue = false;
tbl.Columns["hud"].DefaultValue = false;

也许在SQL服务器中你已经设置了acoustic的默认值,所以错误只出现在hud字段。