자가 생성 ID 키로 데이터 세트 부모 및 자식 테이블을 업데이트하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/931630

  •  06-09-2019
  •  | 
  •  

문제

VB 응용 프로그램에서 ado.net 데이터 세트를 사용하고 있습니다. 부모 테이블 하나와 많은 어린이 테이블이있는 입력 된 데이터 세트가 있습니다. 부모 테이블에 데이터를 삽입 한 다음 동일한 키로 모든 하위 테이블의 데이터를 업데이트 할 때 ID 키를 생성하려고합니다 (포기 키).

마지막으로 데이터베이스 (SQL Server08)에서 데이터 세트를 업데이트하고 싶습니다.

글쎄, 위의 것은 먼저 데이터베이스에 부모 테이블을 직접 삽입하고 자식 테이블에 사용하는 것보다 먼저 부모 테이블을 삽입하여 가능할 수 있습니다.

그러나 나는 이것을 자동 작동으로 원합니다 (Datacontext에서 1 차 및 외국 키를 관리하는 LINQ에서 SQL과 같이).

부모와 자식 테이블의자가 생성 열을 관리하는 데이터 세트에서 그런 것이 가능합니까?

감사,

씨줄

올바른 솔루션이 없습니다

다른 팁

나는 이것이 더 분명해야하며 조정없이 작동해야한다고 생각합니다. 그러나 여전히, 그것은 매우 쉽습니다.

솔루션에는 두 부분이 있습니다.

  1. 만들다 DataRelation 아동과 부모 테이블 사이에서 업데이트시 캐스케이드로 설정합니다. 이렇게하면 부모 ID가 변경 될 때마다 모든 어린이가 업데이트됩니다.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId"))
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade
    
  2. 데이터 세트 삽입 및 업데이트 명령은 양방향입니다. 출력 매개 변수가 바인드가 있거나 데이터 행이 반환되면 업데이트를 일으킨 데이터 세트 행을 업데이트하는 데 사용됩니다.

    이는이 특정 문제에 가장 유용합니다.자가 생성 열을 응용 프로그램으로 되돌려 놓는 데 가장 유용합니다. 정체성 외에도 이것은 예를 들어 타임 스탬프 열일 수 있습니다. 그러나 정체성이 가장 유용합니다.

    우리가해야 할 일은 ID를 반환하도록 삽입 명령을 설정하는 것입니다. 예를 들어 다음과 같은 몇 가지 방법이 있습니다.

    a) 출력 매개 변수와 함께 저장된 절차 사용. 이것은 "실제"데이터베이스 중에서 가장 휴대하는 방법입니다.

    b) 여러 SQL 문을 사용하여 마지막으로 삽입 된 행을 반환합니다. 이것은 SQL Server에만 해당되지만 가장 간단합니다.

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...);
    select * from Parent where Id = SCOPE_IDENTITY();
    

이것을 설정 한 후에는 부모 행을 Id고유 한 (단일 데이터 세트 내에서)이지만 데이터베이스에서는 불가능합니다. 음수는 일반적으로 좋은 선택입니다. 그러면 데이터 세트 변경 사항을 데이터베이스로 저장하면 모든 새로운 상위 행이 실제가됩니다. Id데이터베이스에서 S.


참고 : 여러 문의 지원이없고 저장 프로 시저 (예 : 액세스)없이 데이터베이스를 사용하는 경우 이벤트 핸들러를 설정해야합니다. RowUpdated 상위 테이블 어댑터에서 이벤트. Hanler에서는 정체성을 얻어야합니다 select @@IDENTITY 명령.


일부 링크 :

지적해야 할 몇 가지.

  1. 예, 두 테이블 모두에 할당 된 관계가 필요합니다. XSD 편집기에서 확인할 수 있습니다 (XSD 파일을 두 번 클릭하십시오). 기본적으로 관계는 '업데이트 규칙'이없는 '관계 만'으로 설정됩니다. '관계 편집'으로 들어가서이 관계를 편집하고 '외국 키 제약 조건 만'또는 '둘 다 ~~~'를 선택하십시오. 그리고 '업데이트 규칙'을 캐스케이드로 설정해야합니다! '삭제 규칙'은 당신에게 달려 있습니다.

  2. 이제 새 자식 테이블 행에 새 부모 테이블 행 (AutoinCrement)을 외국 키로 사용하면 새 상위 행을 사용하기 전에 먼저 부모 행을 테이블에 추가해야합니다.

  3. TableAdapter를 사용하여 상위 테이블의 업데이트를 호출하자마자 관련 Child Table의 새 행에는 올바른 ParentID가 자동으로 나타납니다.

내 간단한 코드 스 니펫 :

'--- Make Parent Row
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow
drOrder.SomeValue = "SomeValue"
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables....
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1")
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2")
'....
'....

'--- Update Parent table first
myTableAdapterTOrder.Update(myDS.TOrder)
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1)
'--- will become real number given by SQL server. And also new rows in child table will
'--- have the updated parentID

'--- Now update child table
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail)

도움이되기를 바랍니다!

데이터 세트를 사용하고 싶지 않지만 ID를 자식에 할당하고 ID를 가져 와서 모델을 업데이트 할 수 있도록 ID를 얻으십시오.https://danielwertheim.wordpress.com/2010/24/c-batch-identity-inserts/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top