DataTable的插入行数据问题?

secondonsite 2008-05-28 09:34:22
有一DataTable,其中一列ID是自动增量的主键。怎样插入一行新数据?每次插入都报ID列不能为Null,唯一等。
...全文
452 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
etherealkite 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 secondonsite 的回复:]
Select 字段列表里不列出BledID资增列,我有些更新的行怎么处理?SqlDataAdapter.Update();会把我本意要更新的行也变成插入了。是吗?
[/Quote]
是啊,难道你的主键是BledID列吗?那你在数据库设计的时候就不要设计成自增的,然后在插入数据行时给它赋值,让其自增;如果你硬要设计成自增的话,那就设置其它的列为主键咯。
secondonsite 2008-05-29
  • 打赏
  • 举报
回复
Select 字段列表里不列出BledID资增列,我有些更新的行怎么处理?SqlDataAdapter.Update();会把我本意要更新的行也变成插入了。是吗?
etherealkite 2008-05-29
  • 打赏
  • 举报
回复
Select * From BledAnimalCode这句不要查询全部的出来,不要包含那个自增的列,在添加数据行的时候,不用管。
secondonsite 2008-05-29
  • 打赏
  • 举报
回复
我的想法同上面几位一样,认为BledID为DBNull.Value,插入时DataTable自动填入增量值。这种想法大概是错的,但是我不知道else之后该如何写?
etherealkite 2008-05-29
  • 打赏
  • 举报
回复
BledID列你设定了不允许为空啊,但是你并没有处理它为空的情况啊。你只处理了它不为空的情况
if (this.grdCheckAnimals.Rows[i].Cells["BledID"].Value != DBNull.Value)
{
CheckedRows[ic][0] = this.grdCheckAnimals.Rows[i].Cells["BledID"].Value; //填充DataRow每个列的字段;
}
else 呢?

secondonsite 2008-05-29
  • 打赏
  • 举报
回复
我这也如同汶川。UP
secondonsite 2008-05-29
  • 打赏
  • 举报
回复
谢谢上面各位指点。但是我是忽略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.

请高手点拨,再次谢谢!
小可丁儿 2008-05-29
  • 打赏
  • 举报
回复
" dsUpdate.Tables[0].Rows.Add(CheckedRows[ic]); //Column 'BledID' does not allow nulls.

"
数据库不允许为空 你就不能插空的数据阿
else之后的办法是什么呢??
如果是测试环境 就随便给个值或者改一下数据库的设置
secondonsite 2008-05-29
  • 打赏
  • 举报
回复
似乎明白了。有问题再问你,谢谢!结贴
SSXYC 2008-05-28
  • 打赏
  • 举报
回复
不用管他的,保存数据库再作处理
HimeTale 2008-05-28
  • 打赏
  • 举报
回复
直接插入
id无视
zeroes2021 2008-05-28
  • 打赏
  • 举报
回复
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);

调试通过 没有问题
贫僧又回来了 2008-05-28
  • 打赏
  • 举报
回复
ID自增的就不需要插入ID了
wzy_love_sly 2008-05-28
  • 打赏
  • 举报
回复
怎么写的帖出来

110,547

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧