一对多关联的数据库在VB.NET中如何新增记录

原创 2004年06月02日 10:03:00
有两个表order(orderid,ordername,totalprice), orderdetail(orderid,productid,productname,price) 已经建立一对多
关联(orderid). 用VB.net建立一个窗体, 用于主表和明细表的数据录入及更新.
在窗体上增加两个sqldataadapter,分别选择order和orderdetail表, 并生成数据集,在DATASET中建立关联(orderid)
 
主表中:ORDERID,ORDERNAME 绑定在两个TEXTBOX文本框中,用于接受用户的输入,totalprice接受明细表中price
的汇总值.
明细表绑定到一个DATAGRID控件, datasource:dsorder; datamember:order.orderorderdetail建立的关联名称
问题:
 
      在主表中新增一个记录,用户录入orderid和ordername后,进入明细表的录入,用户录入productid, productname, price后,提示
 “明细orderID列不允许空值,要更正该值吗?”  是什么原因?
    用于连接主表的明细orderID如果输入跟主表一样的orderID时提示“ForeignKeyconstraint 要求在交叉表中存在子键值。要更正该值吗?”

只有录入主表中的orderid和ordername后, 先更新主表数据源,才可以编辑更新明细表,这是为什么?
 
请问,有没有其他更好的方法, 实现主表和明细表的新增记录同时更新呢?
 
    谢谢关照!
                                                                        网友:方宇
 
回复:http://qsltz@21cn.com
http://qsl_tz@hotmail.com

附部分源代码:
Public Class fmOrders
    Inherits System.Windows.Forms.Form
      Dim WithEvents dtOrderDetails As New DataTable()
    Dim BmOrders As BindingManagerBase
    Dim BmOrderDetails As BindingManagerBase
    Dim OrderDetailsHasChange As Boolean
    Dim orderid As DataColumn
dim ordername as datacolumn
    Dim SubTotal As DataColumn
 
 Private Sub bnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnFirst.Click
        BmOrders.Position = 0
    End Sub
 Private Sub bnPrior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnPrior.Click
        BmOrders.Position -= 1
    End Sub
 Private Sub bnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnNext.Click
        BmOrders.Position += 1
    End Sub
 Private Sub bnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnLast.Click
        BmOrders.Position = BmOrders.Count - 1
 End Sub
 
    Private Sub bnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnAdd.Click
        Try
            BmOrders.EndCurrentEdit()
            BmOrders.AddNew()
        
        Catch err As System.SystemException
            MessageBox.Show(err.ToString)
        End Try
    End Sub
  Private Sub bnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnLoad.Click
        FillData()
    End Sub
 
    Private Sub bnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnUpdate.Click
        Dim dsTestOrdersChange As DataSet
 
        BmOrderDetails.EndCurrentEdit()
        BmOrders.EndCurrentEdit()
        If Not dsTestOrders.HasChanges(DataRowState.Deleted) Then
            Try
                daOrders.Update(dsTestOrders, "Orders")
                daOrderDetails.Update(dsTestOrders, "OrderDetails")
                dsTestOrders.AcceptChanges()
            Catch err As System.SystemException
                dsTestOrders.RejectChanges()
                MessageBox.Show(err.ToString)
                Throw
            End Try
        Else
            Try
                daOrderDetails.Update(dsTestOrders, "OrderDetails")
                daOrders.Update(dsTestOrders, "Orders")
                dsTestOrders.AcceptChanges()
            Catch err As System.SystemException
                dsTestOrders.RejectChanges()
                MessageBox.Show(err.ToString)
                Throw
            End Try
        End If
    End Sub
 
    Private Sub fmOrders_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        FillData()
        dtOrderDetails = dsTestOrders.Tables("OrderDetails")
        BmOrders = Me.BindingContext(dsTestOrders, "Orders")
        BmOrderDetails = Me.BindingContext(dsTestOrders, "Orders.OrdersOrderDetails")
        OrderDetailsHasChange = True
        SubTotal = dsTestOrders.Tables("Orders").Columns("SubTotal")
        SubTotal.DefaultValue = 0
         Price = dsTestOrders.Tables("OrderDetails").Columns("Price")
        Price.DefaultValue = 0
    End Sub
 
    Private Sub FillData()
        dsTestOrders.EnforceConstraints = False
        daOrders.Fill(dsTestOrders)
        daOrderDetails.Fill(dsTestOrders)
        dsTestOrders.EnforceConstraints = True
    End Sub
    Private Sub dtOrderDetails_ColumnChanged(ByVal sender As Object, ByVal e As System.Data.DataColumnChangeEventArgs) _
    Handles dtOrderDetails.ColumnChanged
 
        Dim drOrders As DataRow
        Dim drOrderDetails As DataRow
        Dim iSubTotal As Integer
        Try
            If OrderDetailsHasChange Then
               OrderDetailsHasChange = False
               drOrders = dsTestOrders.Tables("Orders").Rows(BmOrders.Position)
                iSubTotal = 0
                For Each drOrderDetails In drOrders.GetChildRows("OrdersOrderDetails")
 

                    iSubTotal = iSubTotal + drOrderDetails("price")
                Next
                drOrders.BeginEdit()
                drOrders("SubTotal") = iSubTotal
                drOrders.EndEdit()
            End If
        Finally
            OrderDetailsHasChange = True
        End Try
    End Sub
 
 
 
 
 
   
 
    Private Sub bndelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bndelete.Click
        If BmOrders.Count > 0 Then
            BmOrders.RemoveAt(BmOrders.Position)
        End If
 

    End Sub
 
    Private Sub bncancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bncancel.Click
        BmOrders.CancelCurrentEdit()
 
    End Sub
End Class
 

数据库设计(一对一,一对多,多对多)关联查询

※表与表之间的关系 1、一对一 需要两个表。当然做项目时为了省空间,通常只建一个表,如果要实现一对一的查询,可以建两个视图。示例如下: 1)建物理表,初始化数据 CREATE TABLE person...
  • jrdgogo
  • jrdgogo
  • 2016年08月15日 16:35
  • 5046

SQL 一对多关系检索多行中的一条记录

今天工作中,需要从多表抽取数据。抽取逻辑就是在一对多关系表中,需要检索符合条件的多行中的一条记录。 DEMO如下: A表: B表: 具体的抽取的逻辑: 所有的A_name对应的 B...
  • Return__Null
  • Return__Null
  • 2015年09月08日 15:06
  • 2582

SQL 数据库 学习 011 关系、一对一、一对多、多对多

我的电脑系统:Windows 10 64位 SQL Server 软件版本: SQL Server 2014 Express 什么是关系定义: 表和表之间的联系。 实现方式: 通过设置不同形式的外键...
  • github_35160620
  • github_35160620
  • 2016年10月14日 21:23
  • 14709

Mybatis一对多、多对一、批量插入

在项目开发中,我们有遇到的对象关系通常是复杂的,每个对象并不是单独的。比如学生和老师之间关系,一个老师有多个学生,每个学生会对应一个老师(这里的老师主要是班主任),这种关系其实就是一对多的关系。Myb...
  • dyy_gusi
  • dyy_gusi
  • 2015年10月21日 12:03
  • 10546

mybatis中一对多添加

如果一个表可以上传一个图片,也可以上传多个图片,也可以不上传图片,图片的信息放在附件表里面,那么后台怎样接收前台传过来的值呢?前台后怎样传第图片的值呢。 1.第一种方法是前台传一个字符串过来。前台将...
  • muyeju
  • muyeju
  • 2015年10月23日 16:24
  • 1468

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月22日 08:15
  • 31183

【数据表间关联关系】 一对多、多对一、一对一、多对多

关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系; 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 多对一:从球员角度来说多个球员属于一个球队 即为多对一 ...
  • guomutian911
  • guomutian911
  • 2016年06月02日 09:51
  • 2269

jpa 双向一对多,多对一关联关系

1.1.  双向一对多 Order.java package com.morris.entity; import java.util.Set; import...
  • u022812849
  • u022812849
  • 2015年01月14日 22:12
  • 13274

Hibernate一对多,多对一,多对多,一对一关系汇总

http://developer.51cto.com/art/200906/127132.htm Hibernate如果上手了,那么在Hibernate中的一对多,多对一,多对多,一...
  • zxygww
  • zxygww
  • 2016年03月25日 20:10
  • 1038

Mysql基本语句操作(二)---一对多的实现和关联语句的用法

二、一对多 ※案例的需求: 一个人可以拥有多辆汽车,要求查询出某人所拥有的所有汽车 数据库设计 方案一(差的设计) 编号  姓名   性别   年龄   汽车编号    车型   排量   价格 ...
  • qq_36171618
  • qq_36171618
  • 2017年07月28日 09:40
  • 250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一对多关联的数据库在VB.NET中如何新增记录
举报原因:
原因补充:

(最多只允许输入30个字)