B表中有三个字段ID(标识符自增,主键),CID(外键,这个键和A表的ID字段关联),和一个nvarchar的内容字段
C表中也有三个字段ID(标识符自增,主键),TID(外键,这个键和B表的ID字段关联),和一个nvarchar的内容字段
我在VS中使用菜单“数据”-“显示数据源”-然后添加数据源,把这三个表添加好了,从数据源窗口中把它们拖放到我的窗体上形成了3个DataGridView,(使用级连的方式拖放出来的),然后我运行程序对三个DataGridView进行添加操作,然后最后按下OK按钮(这个按钮仅仅就是三条语句就是DataAdapter.Update(A表);
DataAdapter.Update(B表);
DataAdapter.Update(C表);
但是经常发生Insert错误,外键关联什么的在B表或者C表的xxxx字段,column ID这样的异常,或者是显示提交到数据库成功,但是内容并没有成功写入到数据库的情况,这是什么原因?
我用的是VS2005,.NET2.0
12 个解决方案
#1
也就是说,你在对B表|C表进行增删操作的时候由于外键的级联的关系,要符合参考完整性的约束.要不然就会出现插入异常或是修改异常.
#2
能否说的详细点,楼上的兄弟
#3
to 但是经常发生Insert错误,外键关联什么的在B表或者C表的xxxx字段,column ID这样的异常,或者是显示提交到数据库成功,但是内容并没有成功写入到数据库的情况,这是什么原因?
这可能是你主键以及外键的原因,不过想你同时操纵三个表的话,那么你用插入的顺序应该是
1、插入A表,并获得其主键ID,然后更新B表中的外键ID;
2、插入B表,并获得其主键ID,然后更新C表中的外键ID;
3、插入C表。
不过你这三个表,如果比较合理的做法,应该用存储来做,可能效果更好。
这可能是你主键以及外键的原因,不过想你同时操纵三个表的话,那么你用插入的顺序应该是
1、插入A表,并获得其主键ID,然后更新B表中的外键ID;
2、插入B表,并获得其主键ID,然后更新C表中的外键ID;
3、插入C表。
不过你这三个表,如果比较合理的做法,应该用存储来做,可能效果更好。
#4
你在insert中查入的ID在主表无记录
要先在主表主INSERT 好记录
才能在子表中insert
要先在主表主INSERT 好记录
才能在子表中insert
#5
参照完整性
#6
我使用的是拖放数据源的方式,并且显示了所有列,每次添加我都参看了对应的ID和CID/ID和TID的关联,都是正确的,但是就是写入数据库的时候会报错!非常离谱,(偶尔报错),然后还有就是报告写入数据库成功,但是发现并没有写入成功,下次打开发现,数据没有写入,刚才输入的内容丢失了
#7
对了,我用的数据库是SQL Server 2005 Express Edition,现在的情况是很多时候提交了,但是内容却没有写入到数据库,数据库也没有报告异常什么的
#8
因為你定義的gridview是通過拖動將數據導入進去的﹐如果你在數據庫中定義了外鍵和主鍵的話
microsoft在控閒中也定義了同樣的外鍵和主鍵,如果你只是在操作時候插入一個表的話,就彙報出外鍵關聯錯誤。
microsoft在控閒中也定義了同樣的外鍵和主鍵,如果你只是在操作時候插入一個表的話,就彙報出外鍵關聯錯誤。
#9
问题是,我操作的时候插入了3个表
#10
怎么写的贴出来看看,
不可能提交没插入还不报错,在检查下
不可能提交没插入还不报错,在检查下
#11
不用写代码,直接就是从数据源窗口中拖出3个DataGridView就可以了,然后在按下确定按钮的时候调用
this.Validate();
this.fixtureTypeBindingSource.EndEdit();
this.fixtureTypeTableAdapter.Update(this.Task_DataDataSet.fixtureType);
this.patrolContentBindingSource.EndEdit();
this.patrolContentTableAdapter.Update(this.Task_DataDataSet.PatrolContent);
this.patrolCriterionBindingSource.EndEdit();
this.patrolCriterionTableAdapter.Update(this.Task_DataDataSet.PatrolCriterion);
MessageBox.Show("写入数据库成功!");
this.Validate();
this.fixtureTypeBindingSource.EndEdit();
this.fixtureTypeTableAdapter.Update(this.Task_DataDataSet.fixtureType);
this.patrolContentBindingSource.EndEdit();
this.patrolContentTableAdapter.Update(this.Task_DataDataSet.PatrolContent);
this.patrolCriterionBindingSource.EndEdit();
this.patrolCriterionTableAdapter.Update(this.Task_DataDataSet.PatrolCriterion);
MessageBox.Show("写入数据库成功!");
#12
走了一个折中的方法把问题解决了!
取消数据库中的ID自增,在VS里面使用自增
取消数据库中的ID自增,在VS里面使用自增
#1
也就是说,你在对B表|C表进行增删操作的时候由于外键的级联的关系,要符合参考完整性的约束.要不然就会出现插入异常或是修改异常.
#2
能否说的详细点,楼上的兄弟
#3
to 但是经常发生Insert错误,外键关联什么的在B表或者C表的xxxx字段,column ID这样的异常,或者是显示提交到数据库成功,但是内容并没有成功写入到数据库的情况,这是什么原因?
这可能是你主键以及外键的原因,不过想你同时操纵三个表的话,那么你用插入的顺序应该是
1、插入A表,并获得其主键ID,然后更新B表中的外键ID;
2、插入B表,并获得其主键ID,然后更新C表中的外键ID;
3、插入C表。
不过你这三个表,如果比较合理的做法,应该用存储来做,可能效果更好。
这可能是你主键以及外键的原因,不过想你同时操纵三个表的话,那么你用插入的顺序应该是
1、插入A表,并获得其主键ID,然后更新B表中的外键ID;
2、插入B表,并获得其主键ID,然后更新C表中的外键ID;
3、插入C表。
不过你这三个表,如果比较合理的做法,应该用存储来做,可能效果更好。
#4
你在insert中查入的ID在主表无记录
要先在主表主INSERT 好记录
才能在子表中insert
要先在主表主INSERT 好记录
才能在子表中insert
#5
参照完整性
#6
我使用的是拖放数据源的方式,并且显示了所有列,每次添加我都参看了对应的ID和CID/ID和TID的关联,都是正确的,但是就是写入数据库的时候会报错!非常离谱,(偶尔报错),然后还有就是报告写入数据库成功,但是发现并没有写入成功,下次打开发现,数据没有写入,刚才输入的内容丢失了
#7
对了,我用的数据库是SQL Server 2005 Express Edition,现在的情况是很多时候提交了,但是内容却没有写入到数据库,数据库也没有报告异常什么的
#8
因為你定義的gridview是通過拖動將數據導入進去的﹐如果你在數據庫中定義了外鍵和主鍵的話
microsoft在控閒中也定義了同樣的外鍵和主鍵,如果你只是在操作時候插入一個表的話,就彙報出外鍵關聯錯誤。
microsoft在控閒中也定義了同樣的外鍵和主鍵,如果你只是在操作時候插入一個表的話,就彙報出外鍵關聯錯誤。
#9
问题是,我操作的时候插入了3个表
#10
怎么写的贴出来看看,
不可能提交没插入还不报错,在检查下
不可能提交没插入还不报错,在检查下
#11
不用写代码,直接就是从数据源窗口中拖出3个DataGridView就可以了,然后在按下确定按钮的时候调用
this.Validate();
this.fixtureTypeBindingSource.EndEdit();
this.fixtureTypeTableAdapter.Update(this.Task_DataDataSet.fixtureType);
this.patrolContentBindingSource.EndEdit();
this.patrolContentTableAdapter.Update(this.Task_DataDataSet.PatrolContent);
this.patrolCriterionBindingSource.EndEdit();
this.patrolCriterionTableAdapter.Update(this.Task_DataDataSet.PatrolCriterion);
MessageBox.Show("写入数据库成功!");
this.Validate();
this.fixtureTypeBindingSource.EndEdit();
this.fixtureTypeTableAdapter.Update(this.Task_DataDataSet.fixtureType);
this.patrolContentBindingSource.EndEdit();
this.patrolContentTableAdapter.Update(this.Task_DataDataSet.PatrolContent);
this.patrolCriterionBindingSource.EndEdit();
this.patrolCriterionTableAdapter.Update(this.Task_DataDataSet.PatrolCriterion);
MessageBox.Show("写入数据库成功!");
#12
走了一个折中的方法把问题解决了!
取消数据库中的ID自增,在VS里面使用自增
取消数据库中的ID自增,在VS里面使用自增