DataTable的插入行数据问题? 有一DataTable,其中一列ID是自动增量的主键。怎样插入一行新数据?每次插入都报ID列不能为Null,唯一等。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DataTable dt = new DataTable(); DataColumn dc = new DataColumn("autoId", typeof(Int32)); dc.AutoIncrement = true; dc.AutoIncrementSeed = 0; dc.AutoIncrementStep = 2; dt.Columns.Add(dc); DataColumn dc2 = new DataColumn("Name", typeof(string)); dt.Columns.Add(dc2); DataRow dr = dt.NewRow(); dr["Name"] = "aaaa"; dt.Rows.Add(dr);调试通过 没有问题 谢谢上面各位指点。但是我是忽略ID列的赋值,插入时依然报错,程序如下:private void UpdateTable() { DataSet dsUpdate = ConnDB.ExcCommReturnDSet("Select * From BledAnimalCode"); dsUpdate.Tables[0].PrimaryKey = new DataColumn[] { dsUpdate.Tables[0].Columns["BledID"] }; //dsUpdate.Tables[0].Columns["BledID"].Unique = true; DataRow[] CheckedRows = new DataRow[this.grdCheckAnimals.Rows.Count]; //使用DataTable.NewRow新建一个DataRow; int ic = 0; //Checked Bled 的行索引。 for (int i = 0; i < this.grdCheckAnimals.Rows.Count; i++ ) { if ((int)grdCheckAnimals.Rows[i].Cells["Bled"].Value == 1) { CheckedRows[ic] = dsUpdate.Tables[0].NewRow(); //使用DataTable.NewRow新建一个DataRow; if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value) { CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value; //填充DataRow每个列的字段; } CheckedRows[ic][1] = this.grdCheckAnimals.Rows[i].Cells["CatalogID"].Value; //填充DataRow每个列的字段; CheckedRows[ic][2] = this.grdCheckAnimals.Rows[i].Cells["Animal"].Value; //填充DataRow每个列的字段; CheckedRows[ic][3] = this.grdCheckAnimals.Rows[i].Cells["BledDate"].Value; //填充DataRow每个列的字段; CheckedRows[ic][4] = this.grdCheckAnimals.Rows[i].Cells["PooledDate"].Value; //填充DataRow每个列的字段; CheckedRows[ic][5] = this.grdCheckAnimals.Rows[i].Cells["Comments"].Value; //填充DataRow每个列的字段; if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value) //修改行数据; { dsUpdate.Tables[0].BeginLoadData(); dsUpdate.Tables[0].LoadDataRow(CheckedRows[ic].ItemArray, false); dsUpdate.Tables[0].EndLoadData(); } else { dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //将DataRow添加到DataTable的Rows集合——插入新行数据; //上面这句报错:Column 'BledID' does not allow nulls. } ic++; } } ConnDB.UpdateTable("Select * From BledAnimalCode", dsUpdate.Tables[0]); }我解释一下程序的大致情况:首先从DataGridView网格控件中筛选CheckedBox选中的行保存。要保存的行有些是数据库里已有的,更新即可。另一些行是数据库没有的,插入数据库。还有就是数据库有的行但DataGridView没有选中,就要删除数据库的这个行,这条还没写。现解决上面的问题。报错是在 dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //Column 'BledID' does not allow nulls.请高手点拨,再次谢谢! BledID列你设定了不允许为空啊,但是你并没有处理它为空的情况啊。你只处理了它不为空的情况if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value) { CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value; //填充DataRow每个列的字段; } else 呢? 我的想法同上面几位一样,认为BledID为DBNull.Value,插入时DataTable自动填入增量值。这种想法大概是错的,但是我不知道else之后该如何写? Select * From BledAnimalCode这句不要查询全部的出来,不要包含那个自增的列,在添加数据行的时候,不用管。 Select 字段列表里不列出BledID资增列,我有些更新的行怎么处理?SqlDataAdapter.Update();会把我本意要更新的行也变成插入了。是吗? 是啊,难道你的主键是BledID列吗?那你在数据库设计的时候就不要设计成自增的,然后在插入数据行时给它赋值,让其自增;如果你硬要设计成自增的话,那就设置其它的列为主键咯。 " dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //Column 'BledID' does not allow nulls. "数据库不允许为空 你就不能插空的数据阿else之后的办法是什么呢??如果是测试环境 就随便给个值或者改一下数据库的设置 依次读取文本每行,再以对每行以空格分割符,如何实现呢? 一个关于开发msn机器人的群,大家有意者加入阿 如何获取一个WebForm的HTTP头信息和POST过来的XML字符串? C#调用windows api 给第三方软件界面传值 c# 两个对象属性值比较 编辑后生成的.pbd是什么文件,有什么用,我发布时要把它加载吗 郁闷之事,大家来看看!!!!!!!!!!!!! 高分求解.net2002升级到.net2003的问题(急)! 动态创建控件以后,怎么访问动态控件的一些属性或者赋值 求出4个数中的最大最小值,很菜的一个问题 标签框不能显示了 递归算法实现
DataColumn dc = new DataColumn("autoId", typeof(Int32));
dc.AutoIncrement = true;
dc.AutoIncrementSeed = 0;
dc.AutoIncrementStep = 2;
dt.Columns.Add(dc); DataColumn dc2 = new DataColumn("Name", typeof(string));
dt.Columns.Add(dc2);
DataRow dr = dt.NewRow();
dr["Name"] = "aaaa";
dt.Rows.Add(dr);调试通过 没有问题
{
DataSet dsUpdate = ConnDB.ExcCommReturnDSet("Select * From BledAnimalCode");
dsUpdate.Tables[0].PrimaryKey = new DataColumn[] { dsUpdate.Tables[0].Columns["BledID"] };
//dsUpdate.Tables[0].Columns["BledID"].Unique = true;
DataRow[] CheckedRows = new DataRow[this.grdCheckAnimals.Rows.Count]; //使用DataTable.NewRow新建一个DataRow;
int ic = 0; //Checked Bled 的行索引。
for (int i = 0; i < this.grdCheckAnimals.Rows.Count; i++ )
{
if ((int)grdCheckAnimals.Rows[i].Cells["Bled"].Value == 1)
{
CheckedRows[ic] = dsUpdate.Tables[0].NewRow(); //使用DataTable.NewRow新建一个DataRow;
if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value)
{
CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value; //填充DataRow每个列的字段;
} CheckedRows[ic][1] = this.grdCheckAnimals.Rows[i].Cells["CatalogID"].Value; //填充DataRow每个列的字段;
CheckedRows[ic][2] = this.grdCheckAnimals.Rows[i].Cells["Animal"].Value; //填充DataRow每个列的字段;
CheckedRows[ic][3] = this.grdCheckAnimals.Rows[i].Cells["BledDate"].Value; //填充DataRow每个列的字段;
CheckedRows[ic][4] = this.grdCheckAnimals.Rows[i].Cells["PooledDate"].Value; //填充DataRow每个列的字段;
CheckedRows[ic][5] = this.grdCheckAnimals.Rows[i].Cells["Comments"].Value; //填充DataRow每个列的字段;
if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value) //修改行数据;
{
dsUpdate.Tables[0].BeginLoadData();
dsUpdate.Tables[0].LoadDataRow(CheckedRows[ic].ItemArray, false);
dsUpdate.Tables[0].EndLoadData();
}
else
{
dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //将DataRow添加到DataTable的Rows集合——插入新行数据;
//上面这句报错:Column 'BledID' does not allow nulls.
}
ic++;
}
}
ConnDB.UpdateTable("Select * From BledAnimalCode", dsUpdate.Tables[0]);
}我解释一下程序的大致情况:首先从DataGridView网格控件中筛选CheckedBox选中的行保存。要保存的行有些是数据库里已有的,更新即可。另一些行是数据库没有的,插入数据库。还有就是数据库有的行但DataGridView没有选中,就要删除数据库的这个行,这条还没写。现解决上面的问题。报错是在
dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //Column 'BledID' does not allow nulls.请高手点拨,再次谢谢!
if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value)
{
CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value; //填充DataRow每个列的字段;
}
else 呢?
数据库不允许为空 你就不能插空的数据阿
else之后的办法是什么呢??
如果是测试环境 就随便给个值或者改一下数据库的设置