다음을 통해 공유


.NET Framework 애플리케이션에서 데이터베이스에 데이터를 다시 저장

참고 항목

데이터 집합 및 관련 클래스는 2000년대 초반에 적용된 레거시 .NET Framework 기술로, 응용 프로그램이 데이터베이스에서 연결이 끊어진 동안 응용 프로그램이 메모리의 데이터로 작업할 수 있도록 합니다. 사용자가 데이터를 수정하고 변경 내용을 다시 데이터베이스에 유지할 수 있도록 하는 애플리케이션에 특히 유용합니다. 데이터 세트는 매우 성공적인 기술로 입증되었지만 새 .NET 애플리케이션은 Entity Framework Core를 사용하는 것이 좋습니다. Entity Framework는 표 형식 데이터를 개체 모델로 사용하는 더 자연스러운 방법을 제공하며 더 단순한 프로그래밍 인터페이스를 제공합니다.

데이터 세트는 데이터의 메모리 내 복사본입니다. 해당 데이터를 수정하는 경우 해당 변경 내용을 데이터베이스에 다시 저장하는 것이 좋습니다. 다음 세 가지 방법 중 하나로 이 작업을 수행합니다.

  • TableAdapter의 Update 메서드 중 하나를 호출

  • TableAdapter의 DBDirect 메서드 중 하나를 호출

  • 데이터 세트에 데이터 세트의 다른 테이블과 관련된 테이블이 포함된 경우 Visual Studio가 자동으로 생성하는 TableAdapterManager에서 UpdateAll 메서드를 호출

데이터 세트 테이블을 Windows 양식 또는 XAML 페이지의 컨트롤에 데이터 바인딩하는 경우 데이터 바인딩 아키텍처가 모든 작업을 수행합니다.

TableAdapter를 잘 아는 경우 다음 항목 중 하나로 바로 이동할 수 있습니다.

항목 설명
데이터베이스에 새 레코드 삽입 TableAdapter 또는 Command 개체를 사용하여 업데이트 및 삽입을 수행하는 방법
TableAdapter를 사용하여 데이터 업데이트 TableAdapter를 사용하여 업데이트를 수행하는 방법
계층적 업데이트 둘 이상의 관련 테이블이 있는 데이터 세트에서 업데이트를 수행하는 방법
동시성 예외 처리 두 사용자가 동시에 데이터베이스의 동일한 데이터를 변경하려고 할 때 동시성 예외를 처리하는 방법
방법: 트랜잭션을 사용하여 데이터 저장 시스템을 사용하여 트랜잭션에 데이터를 저장하는 방법 Transactions 네임스페이스와 TransactionScope 개체
트랜잭션에 데이터 저장 트랜잭션 내에서 데이터베이스에 데이터를 저장하는 방법을 보여 주는 Windows Forms 애플리케이션을 만드는 연습
데이터베이스에 데이터 저장(여러 테이블) 여러 테이블에서 레코드를 편집하고 변경 내용을 데이터베이스에 다시 저장하는 방법
개체에서 데이터베이스로 데이터 저장 TableAdapter DbDirect 메서드를 사용하여 데이터 세트에 없는 개체에서 데이터베이스로 데이터를 전달하는 방법
TableAdapter DBDirect 메서드를 사용하여 데이터 저장 TableAdapter를 사용하여 SQL 쿼리를 데이터베이스에 직접 보내는 방법
데이터 세트를 XML로 저장 XML 문서에 데이터 세트를 저장하는 방법

2단계 업데이트

데이터 원본 업데이트는 2단계 프로세스입니다. 첫 번째 단계는 데이터 세트를 새 레코드, 변경된 레코드 또는 삭제된 레코드로 업데이트하는 것입니다. 애플리케이션에서 이러한 변경 내용을 데이터 원본으로 다시 보내지 않으면 업데이트가 완료된 것입니다.

변경 내용을 데이터베이스로 다시 보내는 경우 두 번째 단계가 필요합니다. 데이터 바인딩된 컨트롤을 사용하지 않는 경우 데이터 세트를 채우는 데 사용한 것과 동일한 TableAdapter(또는 데이터 어댑터)의 Update 메서드를 수동으로 호출해야 합니다. 그러나 예를 들어 다른 어댑터를 사용하여 데이터를 한 데이터 원본에서 다른 데이터 원본으로 이동하거나 여러 데이터 원본을 업데이트할 수도 있습니다. 데이터 바인딩을 사용하지 않고 관련 테이블에 대한 변경 내용을 저장하는 경우 자동 생성된 TableAdapterManager 클래스의 변수를 수동으로 인스턴스화한 다음 해당 UpdateAll 메서드를 호출해야 합니다.

데이터 세트 업데이트의 개념 다이어그램

데이터 세트에는 행 컬렉션을 포함하는 테이블 컬렉션이 포함되어 있습니다. 나중에 기본 데이터 원본을 업데이트하려는 경우 행을 추가 또는 제거할 때 DataTable.DataRowCollection 속성에 대한 메서드를 사용해야 합니다. 이러한 메서드는 데이터 원본을 업데이트하는 데 필요한 변경 추적을 수행합니다. Rows 속성에서 RemoveAt 컬렉션을 호출하면 삭제가 데이터베이스에 다시 전달되지 않습니다.

데이터 세트 병합

다른 데이터 세트와 “병합”하여 데이터 세트의 내용을 업데이트할 수 있습니다. 여기에는 “원본” 데이터 세트의 내용을 호출 데이터 세트(“대상” 데이터 세트라고도 함)에 복사하는 작업이 포함됩니다. 데이터 세트를 병합하면 원본 데이터 세트의 새 레코드가 대상 데이터 세트에 추가됩니다. 또한 원본 데이터 세트의 추가 열이 대상 데이터 세트에 추가됩니다. 데이터 세트 병합은 로컬 데이터 세트가 있고 다른 애플리케이션에서 두 번째 데이터 세트를 얻을 때 유용합니다. XML 웹 서비스와 같은 구성 요소에서 두 번째 데이터 세트를 얻거나 여러 데이터 세트의 데이터를 통합해야 하는 경우에도 유용합니다.

데이터 세트를 병합할 때 Merge 메서드에 기존 수정 사항을 대상 데이터 세트에 유지할지 여부를 알려주는 부울 인수(preserveChanges)를 전달할 수 있습니다. 데이터 세트는 여러 버전의 레코드를 유지하므로 둘 이상의 레코드 버전이 병합된다는 점에 유의해야 합니다. 다음 표에서는 두 데이터 세트의 레코드가 병합되는 방식을 보여줍니다.

DataRowVersion 대상 데이터 세트 원본 데이터 세트
Original James Wilson James C. Wilson
현재 Jim Wilson James C. Wilson

이전 테이블에서 preserveChanges=false targetDataset.Merge(sourceDataset)를 사용하여 Merge 메서드를 호출하면 결과 데이터는 다음과 같습니다.

DataRowVersion 대상 데이터 세트 원본 데이터 세트
Original James C. Wilson James C. Wilson
현재 James C. Wilson James C. Wilson

preserveChanges = true targetDataset.Merge(sourceDataset, true)를 사용하여 Merge 메서드를 호출하면 결과 데이터는 다음과 같습니다.

DataRowVersion 대상 데이터 세트 원본 데이터 세트
Original James C. Wilson James C. Wilson
현재 Jim Wilson James C. Wilson

주의

preserveChanges = true 시나리오에서 대상 데이터 세트의 레코드에 대해 RejectChanges 메서드가 호출되면 해당 레코드가 “원본” 데이터 세트의 원래 데이터로 되돌아갑니다. 즉, 원래 데이터 원본을 대상 데이터 세트로 업데이트하려고 하면 업데이트할 원래 행을 찾지 못할 수 있습니다. 다른 데이터 세트를 데이터 원본의 업데이트된 레코드로 채운 다음 병합을 수행하여 동시성 위반을 방지할 수 있습니다. (데이터 세트가 채워진 후 다른 사용자가 데이터 원본의 레코드를 수정할 때 동시성 위반이 발생합니다.)

제약 조건 업데이트

기존 데이터 행을 변경하려면 개별 열에 데이터를 추가하거나 업데이트합니다. 데이터 세트에 제약 조건(예: 외래 키 또는 null을 허용하지 않음 제약 조건)이 포함된 경우 업데이트할 때 레코드가 일시적으로 오류 상태에 있을 수 있습니다. 즉, 하나의 열을 업데이트한 후 다음 열로 가기 전에 오류 상태가 될 수 있습니다.

조기 제약 조건 위반을 방지하려면 일시적으로 업데이트 제약 조건을 일시 중단할 수 있습니다. 이는 다음 두 가지 용도로 사용됩니다.

  • 하나의 열을 업데이트했지만 다른 열을 업데이트하지 않은 후에 오류가 throw되는 것을 방지합니다.

  • 특정 업데이트 이벤트(유효성 검사에 자주 사용되는 이벤트)가 발생하지 않도록 방지합니다.

참고 항목

Windows Forms에서 datagrid에 기본 제공되는 데이터 바인딩 아키텍처는 포커스가 행 밖으로 이동할 때까지 제약 조건 검사를 일시 중단합니다. 따라서 BeginEdit, EndEdit 또는 CancelEdit 메서드를 명시적으로 호출할 필요가 없습니다.

데이터 세트에 대해 Merge 메서드가 호출되면 제약 조건이 자동으로 비활성화됩니다. 병합이 완료될 때 사용하도록 설정할 수 없는 데이터 세트 제약 조건이 있으면 ConstraintException이 throw됩니다. 이 경우 EnforceConstraints 속성을 false,로 설정하고 모든 제약 조건 위반을 해결한 후 EnforceConstraints 속성을 true로 다시 설정해야 합니다.

업데이트를 완료한 후에도 제약 조건 검사를 다시 활성화할 수 있으며, 이 경우에도 업데이트 이벤트가 다시 활성화되고 발생합니다.

이벤트를 일시 중단하는 방법에 대한 자세한 내용은 데이터 세트를 채우는 동안 제약 조건 해제를 참조하세요.

데이터 세트 업데이트 오류

데이터 세트의 레코드를 업데이트할 때 오류가 발생할 수 있습니다. 예를 들어 실수로 잘못된 형식의 데이터 또는 너무 긴 데이터 또는 다른 무결성 문제가 있는 데이터를 열에 쓸 수 있습니다. 또는 업데이트 이벤트의 모든 단계에서 사용자 지정 오류를 발생시킬 수 있는 애플리케이션별 유효성 검사가 있을 수 있습니다. 자세한 내용은 데이터 세트의 데이터 유효성 검사를 참조하세요.

변경 내용에 대한 정보 유지

데이터 세트의 변경 내용에 대한 정보를 유지하는 데는 행이 변경되었음을 나타내는 플래그를 지정하는 방법(RowState)과 레코드의 여러 복사본을 유지하는 방법(DataRowVersion) 두 가지가 있습니다. 프로세스는 이 정보를 사용하여 데이터 세트에서 변경된 내용을 확인하고 데이터 원본에 적절한 업데이트를 보낼 수 있습니다.

RowState 속성

DataRow 개체의 RowState 속성은 특정 데이터 행의 상태에 대한 정보를 제공하는 값입니다.

다음 표에서는 DataRowState 열거형의 가능한 값에 대해 자세히 설명합니다.

DataRowState 값 설명
Added 행이 항목으로 DataRowCollection에 추가되었습니다. (이 상태의 행은 직전 AcceptChanges 메서드가 호출될 때 존재하지 않기 때문에 해당하는 원래 버전이 없습니다.)
Deleted 행이 DataRow 개체의 Delete를 사용하여 삭제되었습니다.
Detached 행이 만들어졌지만 해당 DataRowCollection행의 일부가 아닙니다. DataRow 개체가 만들어진 직후, 컬렉션에 추가되기 전에, 그리고 컬렉션에서 제거된 후에 이 상태입니다.
Modified 행의 열 값이 변경되었습니다.
Unchanged 행이 마지막으로 호출된 이후로 AcceptChanges 변경되지 않았습니다.

DataRowVersion 열거형

데이터 세트는 여러 버전의 레코드를 유지합니다. DataRowVersion 필드는 DataRow 개체의 Item[] 속성 또는 GetChildRows 메서드를 사용하여 DataRow에서 찾은 값을 검색할 때 사용됩니다.

다음 표에서는 DataRowVersion 열거형의 가능한 값에 대해 자세히 설명합니다.

DataRowVersion 값 설명
Current 레코드의 현재 버전에는 마지막으로 AcceptChanges를 호출한 이후 레코드에서 수행된 모든 수정 내용이 포함됩니다. 행이 삭제된 경우 현재 버전이 없습니다.
Default 데이터 세트 스키마 또는 데이터 원본에 의해 정의된 레코드의 기본값입니다.
Original 레코드의 원래 버전은 데이터 세트에서 마지막으로 변경 내용이 커밋된 시점의 레코드 복사본입니다. 다시 말하면 일반적으로 데이터 원본에서 읽은 버전의 레코드입니다.
Proposed 업데이트 중간에, 즉, BeginEdit 메서드를 호출한 시간과 EndEdit 메서드를 호출한 시간 사이에 일시적으로 사용 가능한 레코드의 제안된 버전입니다. 일반적으로 RowChanging와 같은 이벤트에 대한 처리기에서 제안된 버전의 레코드에 액세스합니다. CancelEdit 메서드를 호출 하면 변경 내용이 취소되고 데이터 행의 제안된 버전이 삭제됩니다.

원본 및 현재 버전은 업데이트 정보가 데이터 원본으로 전송되는 경우에 유용합니다. 일반적으로 업데이트를 데이터 원본에 보낼 때 데이터베이스의 새 정보는 레코드의 현재 버전에 있습니다. 원래 버전의 정보는 업데이트할 레코드를 찾는 데 사용됩니다.

예를 들어 레코드의 기본 키가 변경된 경우에는 변경 내용을 업데이트 하기 위해 데이터 원본에서 올바른 레코드를 찾을 방법이 필요합니다. 원래 버전이 없는 경우 레코드가 데이터 원본에 추가되어 원치 않는 추가 레코드 또는 부정확하고 오래된 레코드가 발생하게 됩니다. 두 버전은 동시성 제어에도 사용됩니다. 데이터 원본의 레코드와 원래 버전을 비교하여 레코드가 데이터 세트에 로드된 후 변경되었는지 확인할 수 있습니다.

제안된 버전은 데이터 세트에 대한 변경 내용을 실제로 커밋하기 전에 유효성 검사를 수행해야 하는 경우에 유용합니다.

레코드가 변경된 경우에도 해당 행의 원래 버전 또는 현재 버전이 항상 존재하지는 않습니다. 테이블에 새 행을 삽입하는 경우 원래 버전이 없고 현재 버전만 있습니다. 마찬가지로, 테이블의 Delete 메서드를 호출하여 행을 삭제하는 경우 원래 버전은 있지만 현재 버전은 없습니다.

데이터 행의 HasVersion 메서드를 쿼리하여 특정 버전의 레코드가 존재하는지 테스트할 수 있습니다. 열의 값을 요청할 때 DataRowVersion 열거형 값을 선택적 인수로 전달하여 두 버전의 레코드 중 하나에 액세스할 수 있습니다.

변경된 레코드 가져오기

일반적으로 데이터 세트의 모든 레코드를 업데이트하지 않는 것이 좋습니다. 예를 들어, 사용자가 많은 레코드를 표시하는 Windows Forms DataGridView 컨트롤을 사용할 수 있습니다. 그러나 사용자는 몇 개의 레코드만 업데이트하고, 한 레코드만 삭제하고, 새 레코드를 하나만 삽입할 수 있습니다. 데이터 세트 및 데이터 테이블은 수정된 행만 반환하는 메서드(GetChanges)를 제공합니다.

데이터 테이블(GetChanges) 또는 데이터 세트(GetChanges)의 GetChanges 메서드를 사용하여 변경된 레코드의 하위 집합을 만들 수 있습니다. 데이터 테이블에서 이 메서드를 호출하면 변경된 레코드만 포함된 테이블의 복사본을 반환합니다. 마찬가지로, 데이터 세트에서 메서드를 호출하면 변경된 레코드만 포함된 새 데이터 세트를 가져옵니다.

GetChanges 자체는 변경된 모든 레코드를 반환합니다. 반면, 원하는 DataRowState를 매개 변수로 GetChanges 메서드에 전달하여 새로 추가된 레코드, 삭제하도록 표시된 레코드, 분리된 레코드 또는 수정된 레코드 중에서 변경된 레코드의 하위 집합을 지정할 수 있습니다.

변경된 레코드의 하위 집합을 가져오는 작업은 처리를 위해 레코드를 다른 구성 요소로 보내려는 경우에 유용합니다. 전체 데이터 세트를 보내는 대신 구성 요소에 필요한 레코드만 가져옴으로써 다른 구성 요소와 통신하는 오버헤드를 줄일 수 있습니다.

데이터 세트에서 변경 내용 커밋

데이터 세트에서 변경이 수행되면 변경된 행의 RowState 속성이 설정됩니다. 원본 및 현재 버전의 레코드는 RowVersion 속성을 사용하여 설정하고, 유지 관리하고, 사용할 수 있습니다. 이러한 변경된 행의 속성에 저장된 메타데이터는 올바른 업데이트를 데이터 원본에 보내는 데 필요합니다.

변경 내용이 데이터 원본의 현재 상태를 반영하는 경우 더 이상 이 정보를 유지할 필요가 없습니다. 일반적으로 데이터 세트와 해당 원본이 동기화되는 시점은 두 번 있습니다.

  • 원본에서 데이터를 읽는 경우와 같이 데이터 세트에 정보를 로드한 직후.

  • 데이터 세트에서 데이터 원본으로 변경 내용을 보낸 후(변경 내용을 데이터베이스에 보내는 데 필요한 변경 정보를 잃게 되므로 이전에는 그렇지 않음)

AcceptChanges 메서드를 호출하여 데이터 세트에 대한 보류 중인 변경 내용을 커밋할 수 있습니다. 일반적으로 AcceptChanges는 다음과 같은 시점에 호출됩니다.

  • 데이터 세트를 로드한 후. TableAdapter의 Fill 메서드를 호출하여 데이터 세트를 로드하는 경우 어댑터는 자동으로 변경 내용을 커밋합니다. 그러나 다른 데이터 세트를 병합하여 데이터 세트를 로드하는 경우에는 변경 내용을 수동으로 커밋해야 합니다.

    참고 항목

    어댑터의 AcceptChangesDuringFill 속성을 false로 설정하여 Fill 메서드를 호출할 때 어댑터가 자동으로 변경 내용을 커밋하는 것을 방지할 수 있습니다. false로 설정된 경우 채우기 중에 삽입된 각 행의 RowStateAdded로 설정됩니다.

  • XML 웹 서비스와 같은 다른 프로세스에 데이터 세트 변경 내용을 전송한 후.

    주의

    이 방법으로 변경 내용을 커밋하면 변경 정보가 모두 삭제됩니다. 애플리케이션이 데이터 세트에서 변경된 내용을 확인해야 하는 작업을 완료한 후에는 변경 내용을 커밋하지 마세요.

이 메서드는 다음 작업을 수행합니다.

AcceptChanges 메서드는 세 가지 수준에서 사용할 수 있습니다. DataRow 개체에 대해 이 메서드를 호출하여 해당 행에 대해서만 변경 내용을 커밋할 수 있습니다. 또한 DataTable 개체에 대해 이 메서드를 호출하여 테이블의 모든 행을 커밋할 수도 있습니다. 마지막으로 DataSet 개체에 대해 이 메서드를 호출하여 데이터 세트에 있는 모든 테이블의 모든 레코드에서 보류 중인 변경 내용을 모두 커밋할 수 있습니다.

다음 표에서는 메서드가 호출되는 개체에 따라 커밋되는 변경 내용을 설명합니다.

메서드 결과
System.Data.DataRow.AcceptChanges 특정 행에 대해서만 변경 내용이 커밋됩니다.
System.Data.DataTable.AcceptChanges 특정 테이블의 모든 행에서 변경 내용이 커밋됩니다.
System.Data.DataSet.AcceptChanges 데이터 세트에 있는 모든 테이블의 모든 행에서 변경 내용이 커밋됩니다.

참고 항목

TableAdapter의 Fill 메서드를 호출하여 데이터 세트를 로드하는 경우에는 변경 내용을 명시적으로 수락할 필요가 없습니다. 기본적으로 Fill 메서드는 데이터 테이블 채우기를 완료한 후에 AcceptChanges 메서드를 호출합니다.

관련 메서드인 RejectChanges는 레코드의 Original 버전을 다시 Current 버전으로 복사하여 변경의 영향을 취소합니다. 또한 각 레코드의 RowState를 다시 Unchanged로 설정합니다.

데이터 유효성 검사

애플리케이션의 데이터가 전달 프로세스의 요구 사항을 충족하는지 확인하려면 유효성 검사를 추가해야 하는 경우가 많습니다. 여기에는 양식에서 사용자 입력이 올바른지 확인하거나, 다른 애플리케이션에서 받은 데이터의 유효성을 검사하거나, 구성 요소 내에서 계산된 정보가 데이터 원본 및 애플리케이션 요구 사항의 제약 조건에 속하는지 확인하는 작업이 포함될 수 있습니다.

다음과 같은 여러 가지 방법으로 데이터의 유효성을 검사할 수 있습니다.

  • 비즈니스 레이어에서 애플리케이션에 데이터의 유효성을 검사하는 코드를 추가합니다. 데이터 세트는 이 작업을 수행할 수 있는 한 위치입니다. 데이터 세트는 열 및 행 값이 변경됨에 따라 변경 내용의 유효성을 검사하는 기능과 같은 백 엔드 유효성 검사의 몇 가지 이점을 제공합니다. 자세한 내용은 데이터 세트의 데이터 유효성 검사를 참조하세요.

  • 프레젠테이션 레이어에서 양식에 유효성 검사를 추가합니다. 자세한 내용은 Windows Forms에서 사용자 입력 유효성 검사를 참조하세요.

  • 데이터 백 엔드에서 데이터 원본(예: 데이터베이스)에 데이터를 보내고 데이터 원본이 데이터를 수락 또는 거부할 수 있도록 합니다. 데이터의 유효성을 검사하고 오류 정보를 제공하는 정교한 기능이 있는 데이터베이스를 사용하는 경우 데이터의 출처에 관계없이 데이터의 유효성을 검사할 수 있기 때문에 이 방법이 실용적일 수 있습니다. 그러나 이 방법은 애플리케이션별 유효성 검사 요구 사항을 수용하지 못할 수 있습니다. 또한 데이터 원본이 데이터의 유효성을 검사하도록 하면 애플리케이션이 백 엔드에서 발생한 유효성 검사 오류를 해결하는 방법에 따라 데이터 원본과의 사이에 왕복이 많아질 수 있습니다.

    Important

    CommandType 속성이 Text로 설정된 데이터 명령을 사용하는 경우 클라이언트에서 보낸 정보를 데이터베이스에 전달하기 전에 신중하게 확인합니다. 악의적인 사용자가 인증되지 않은 액세스 권한을 얻거나 데이터베이스를 손상시키기 위해 수정되었거나 추가된 SQL 문을 전송(주입)할 수도 있습니다. 사용자 입력을 데이터베이스로 전송하기 전에 항상 정보가 유효한지 확인합니다. 가능하면 항상 매개 변수화된 쿼리 또는 저장 프로시저를 사용하는 것이 좋습니다.

데이터 원본에 업데이트 전송

데이터 세트에서 변경을 수행한 후에 변경 내용을 데이터 원본으로 전송할 수 있습니다. 가장 일반적으로는 이를 위해 TableAdapter(또는 데이터 어댑터)의 Update 메서드를 호출합니다. 이 메서드는 데이터 테이블의 각 레코드를 반복하여 필요한 업데이트 유형(업데이트, 삽입 또는 삭제)을 확인한 다음 업데이트 항목이 있는 경우 적절한 명령을 실행합니다.

업데이트가 이루어지는 방법의 예시를 위해, 애플리케이션이 단일 데이터 테이블로 이루어진 데이터 세트를 사용한다고 가정합니다. 애플리케이션은 데이터베이스에서 두 개의 행을 페치합니다. 검색 후 메모리 내 데이터 테이블은 다음과 같습니다.

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Unchanged)    c400         Nancy Buchanan    Pending

애플리케이션은 Nancy Buchanan의 상태를 “선호”로 바꿉니다. 이 변경의 결과로 해당 행의 RowState 속성 값이 Unchanged에서 Modified로 바뀝니다. 첫 번째 행의 RowState 속성 값은 Unchanged로 유지됩니다. 이제 데이터 테이블은 다음과 같습니다.

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Modified)     c400         Nancy Buchanan    Preferred

이제 애플리케이션에서 Update 메서드를 호출하여 데이터 세트을 데이터베이스로 전송합니다. 이 메서드는 각 행을 차례로 검사합니다. 첫 번째 행의 경우 메서드가 SQL 문을 데이터베이스로 전송하지 않습니다. 이 행은 원래 데이터베이스에서 가져온 이후 변경되지 않았기 때문입니다.

그러나 두 번째 행의 경우 Update 메서드가 자동으로 올바른 데이터 명령을 호출하여 데이터베이스로 전송합니다. SQL 명령문의 특정 구문은 기본 데이터 저장소가 지원하는 SQL의 방언에 따라 달라집니다. 그러나 다음과 같은 전송된 SQL 문의 일반적인 특성은 주목해야 합니다.

  • 전송된 SQL 문은 UPDATE 문입니다. UPDATE 속성의 값이 Modified이므로 어댑터는 RowState 문을 사용하는 것을 알고 있습니다.

  • 전송된 SQL 문에는 UPDATE 문의 대상이 CustomerID = 'c400'인 행임을 나타내는 WHERE 절이 포함되어 있습니다. CustomerID는 대상 테이블의 기본 키이므로 SELECT 문의 이 부분은 대상 행을 다른 모든 행과 구별합니다. WHERE 절에 대한 정보는 행을 식별하는 데 필요한 값이 변경된 경우 레코드의 원래 버전(DataRowVersion.Original)에서 파생됩니다.

  • 전송된 SQL 문에는 수정된 열의 새 값을 설정하는 SET 절이 포함되어 있습니다.

    참고 항목

    TableAdapter의 UpdateCommand 속성이 저장 프로시저의 이름으로 설정된 경우 어댑터는 SQL 문을 생성하지 않습니다. 대신, 전달된 적절한 매개 변수를 사용하여 저장 프로시저를 호출합니다.

패스 매개 변수

일반적으로 매개 변수를 사용하여 데이터베이스에서 업데이트될 레코드의 값을 전달합니다. TableAdapter의 Update 메서드는 UPDATE 문을 실행할 때 매개 변수 값을 입력해야 합니다. 적절한 데이터 명령에 대한 Parameters 컬렉션에 이러한 값을 가져옵니다(이 경우 TableAdapter의 UpdateCommand 개체).

Visual Studio 도구를 사용하여 데이터 어댑터를 생성한 경우 UpdateCommand 개체에는 문의 각 매개 변수 자리 표시자에 해당하는 매개 변수 컬렉션이 포함됩니다.

각 매개 변수의 System.Data.SqlClient.SqlParameter.SourceColumn 속성은 데이터 테이블의 열 하나를 가리킵니다. 예를 들어 au_idOriginal_au_id 매개 변수의 SourceColumn 속성은 데이터 테이블에서 작성자 ID가 포함된 열로 설정됩니다. 어댑터의 Update 메서드가 실행되면 업데이트되는 레코드에서 작성자 ID 열을 읽고 문에 값을 채웁니다.

UPDATE 문에서 새 값(레코드에 기록될 값)과 이전 값(레코드를 데이터베이스에 배치할 수 있도록)을 모두 지정해야 합니다. 따라서 각 값에 대해 두 개의 매개 변수가 있습니다. 하나는 SET 절에 대한 매개 변수이고 다른 하나는 WHERE 절에 대한 매개 변수입니다. 두 매개 변수 모두 업데이트되는 레코드에서 데이터를 읽지만 매개 변수의 SourceVersion 속성에 따라 서로 다른 버전의 열 값을 얻습니다. SET 절의 매개 변수는 현재 버전을 가져오고 WHERE 절의 매개 변수는 원래 버전을 가져옵니다.

참고 항목

일반적으로 데이터 어댑터의 RowChanging 이벤트에 대한 이벤트 처리기에서 그렇듯이 Parameters 컬렉션의 값도 코드에서 직접 설정할 수 있습니다.