问一个数据库的问题!已经困扰我很多很多天了!

时间:2022-12-11 18:36:33
我有三个表,A,B,C,A表中有两个字段ID(标识符自增,主键),和一个nvarchar的内容字段
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表。

不过你这三个表,如果比较合理的做法,应该用存储来做,可能效果更好。

#4


你在insert中查入的ID在主表无记录
要先在主表主INSERT 好记录
才能在子表中insert

#5


参照完整性

#6


我使用的是拖放数据源的方式,并且显示了所有列,每次添加我都参看了对应的ID和CID/ID和TID的关联,都是正确的,但是就是写入数据库的时候会报错!非常离谱,(偶尔报错),然后还有就是报告写入数据库成功,但是发现并没有写入成功,下次打开发现,数据没有写入,刚才输入的内容丢失了

#7


对了,我用的数据库是SQL Server 2005 Express Edition,现在的情况是很多时候提交了,但是内容却没有写入到数据库,数据库也没有报告异常什么的

#8


因為你定義的gridview是通過拖動將數據導入進去的﹐如果你在數據庫中定義了外鍵和主鍵的話
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("写入数据库成功!");

#12


走了一个折中的方法把问题解决了!
取消数据库中的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表。

不过你这三个表,如果比较合理的做法,应该用存储来做,可能效果更好。

#4


你在insert中查入的ID在主表无记录
要先在主表主INSERT 好记录
才能在子表中insert

#5


参照完整性

#6


我使用的是拖放数据源的方式,并且显示了所有列,每次添加我都参看了对应的ID和CID/ID和TID的关联,都是正确的,但是就是写入数据库的时候会报错!非常离谱,(偶尔报错),然后还有就是报告写入数据库成功,但是发现并没有写入成功,下次打开发现,数据没有写入,刚才输入的内容丢失了

#7


对了,我用的数据库是SQL Server 2005 Express Edition,现在的情况是很多时候提交了,但是内容却没有写入到数据库,数据库也没有报告异常什么的

#8


因為你定義的gridview是通過拖動將數據導入進去的﹐如果你在數據庫中定義了外鍵和主鍵的話
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("写入数据库成功!");

#12


走了一个折中的方法把问题解决了!
取消数据库中的ID自增,在VS里面使用自增