【问题标题】:insert 2 master detail records in same time issue在同一时间问题中插入 2 个主详细记录
【发布时间】:2019-10-06 01:08:01
【问题描述】:

我在 windows 窗体应用程序中使用 2 个相关表同时插入主从记录,这些表称为例如“Orders”和“Order Details”。

  • 我首先创建名为“dataSet1”的数据集并创建行表 这两张桌子的适配器
  • 然后我在设计模式下打开我的表单并从数据源窗口中删除 首先是“Orders”表,然后我删除相关的“Order Details” 创建主从界面的表,
  • 所以主记录是“Orders”记录,显示为 表单和详细记录“Order Details”显示为datadridview fields
  • 将逻辑代码保存在“ordersBindingNavigatorSaveItem”按钮中 自动创建的bindingnavigator 是这样的:

        this.Validate();
        this.ordersBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.dataSet1);
    
  • 然后当我插入“Order”记录并保存到数据库之前 我创建了至少一个孩子“Order Details”记录然后我打电话 保存上面显示的代码以同时保存我得到的所有内容 像这样的错误:

INSERT 语句与 FOREIGN KEY 约束冲突 “FK_Order_Details_Orders”。数据库发生冲突 “Northwind”,表“dbo.Orders”,列“OrderID”。该声明有 被终止了。

  • 但是当我插入“订单”记录并将其保存到数据库时,我 插入“Order Details”记录并保存一切都很好

我的问题是如何同时插入主记录和子记录?

【问题讨论】:

  • 我认为问题来自于表单在主(父)记录(订单)之前插入详细信息(子)记录(订单详细信息),解决方案可以来自某种方式先插入主记录然后获取主记录的 id 并在子记录的插入语句中使用它作为外键

标签: .net sql-server winforms dataset bindingsource


【解决方案1】:

你应该使用存储过程同时插入两个表

【讨论】:

  • 感谢您的回复,但怎么做?,对不起,我没有存储过程方面的专业知识
  • 请另一种解决方案,因为我认为它没有效率
  • 我可以给你写程序,但首先我需要你的表格完整定义
【解决方案2】:

简而言之,您的代码违反了参照完整性。

根据您的代码示例,我可以看到您正在使用一些框架在数据库中插入记录。我之前使用的框架也不喜欢这样,因为他们希望您先添加主记录,然后添加详细记录。

在继续之前,问问自己为什么要同时添加 master 和 detail 以及是否有办法将其分成 2 个逻辑操作?如果没有,您总是可以编写一个存储过程并从您的代码中调用它:

CREATE PROCEDURE sp_<proc_name>
...
BEGIN TRAN
INSERT INTO <master>...
INSERT INTO <detail>...
COMMIT TRAN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多