비고
클래스 및 관련 클래스는 DataSet 2000년대 초반의 레거시 .NET Framework 기술로, 애플리케이션이 데이터베이스와 연결이 끊긴 동안 애플리케이션이 메모리의 데이터로 작업할 수 있도록 합니다. 이 기술은 사용자가 데이터를 수정하고 변경 내용을 데이터베이스에 다시 유지할 수 있도록 하는 앱에 특히 유용합니다. 데이터 세트는 입증된 성공적인 기술이지만 새 .NET 애플리케이션에 권장되는 방법은 Entity Framework Core를 사용하는 것입니다. Entity Framework는 테이블 형식 데이터를 개체 모델로 사용하는 보다 자연스러운 방법을 제공하며 더 간단한 프로그래밍 인터페이스를 제공합니다.
데이터 세트는 데이터의 메모리 내 복사본입니다. 해당 데이터를 수정하는 경우 해당 변경 내용을 데이터베이스에 다시 저장하는 것이 좋습니다. 다음 세 가지 방법 중 하나로 이 작업을 수행합니다.
TableAdapter의
Update
메서드 중 하나를 호출하여TableAdapter의
DBDirect
메서드 중 하나를 호출하여데이터 세트에 다른 테이블과 관련된 테이블이 포함될 때 Visual Studio가 생성하는 TableAdapterManager의
UpdateAll
메서드를 호출합니다.
데이터 세트 테이블을 Windows Form 또는 XAML 페이지의 컨트롤에 바인딩하는 경우 데이터 바인딩 아키텍처가 모든 작업을 수행합니다.
TableAdapters에 익숙한 경우 다음 항목 중 하나로 바로 이동할 수 있습니다.
주제 | 설명 |
---|---|
데이터베이스에 새 레코드 삽입 | TableAdapters 또는 Command 개체를 사용하여 업데이트 및 삽입을 수행하는 방법 |
TableAdapter를 사용하여 데이터 업데이트 | TableAdapters를 사용하여 업데이트를 수행하는 방법 |
계층 업데이트 | 둘 이상의 관련 테이블이 있는 데이터 세트에서 업데이트를 수행하는 방법 |
동시성 예외 처리 | 두 사용자가 동시에 데이터베이스에서 동일한 데이터를 변경하려고 할 때 예외를 처리하는 방법 |
방법: 트랜잭션을 사용하여 데이터 저장 | 시스템을 사용하여 트랜잭션에 데이터를 저장하는 방법입니다. 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 | 대상 데이터 세트 | 원본 데이터 세트 |
---|---|---|
원본 | 제임스 윌슨 | 제임스 C. 윌슨 |
전류 | 짐 윌슨 | 제임스 C. 윌슨 |
이전 테이블에서 preserveChanges=false targetDataset.Merge(sourceDataset)
을(를) 사용하여 Merge 메서드를 호출하면 다음 데이터가 생성됩니다.
DataRowVersion | 대상 데이터 세트 | 원본 데이터 세트 |
---|---|---|
원본 | 제임스 C. 윌슨 | 제임스 C. 윌슨 |
전류 | 제임스 C. 윌슨 | 제임스 C. 윌슨 |
preserveChanges = true targetDataset.Merge(sourceDataset, true)
메서드를 호출하면 Merge 데이터가 나타납니다.
DataRowVersion | 대상 데이터 세트 | 원본 데이터 세트 |
---|---|---|
원본 | 제임스 C. 윌슨 | 제임스 C. 윌슨 |
전류 | 짐 윌슨 | 제임스 C. 윌슨 |
주의
시나리오에서 preserveChanges = true
메서드가 대상 데이터 세트의 RejectChanges 레코드에서 호출되는 경우 원본 데이터 세트의 원래 데이터로 되돌립니다. 즉, 대상 데이터 세트로 원래 데이터 원본을 업데이트하려고 하면 업데이트할 원래 행을 찾지 못할 수 있습니다. 다른 데이터 세트를 데이터 원본의 업데이트된 레코드로 채운 다음 병합을 수행하여 동시성 위반을 방지할 수 있습니다. (데이터 세트가 채워진 후 다른 사용자가 데이터 원본의 레코드를 수정할 때 동시성 위반이 발생합니다.)
업데이트 제약 조건
기존 데이터 행을 변경하려면 개별 열에서 데이터를 추가하거나 업데이트합니다. 데이터 세트에 제약 조건(예: 외설 키 또는 nullable이 아닌 제약 조건)이 포함된 경우 레코드를 업데이트할 때 레코드가 일시적으로 오류 상태에 있을 수 있습니다. 즉, 한 열 업데이트를 완료한 후 다음 열에 도착하기 전에 오류 상태일 수 있습니다.
조기 제약 조건 위반을 방지하려면 업데이트 제약 조건을 일시적으로 일시 중단할 수 있습니다. 이는 다음 두 가지 용도로 사용됩니다.
한 열의 업데이트를 완료한 후, 다른 열 업데이트를 시작하기 전에 오류가 발생하는 것을 방지합니다.
특정 업데이트 이벤트가 발생하지 않도록 방지합니다(유효성 검사에 자주 사용되는 이벤트).
비고
Windows Forms의 datagrid에 기본 제공된 데이터 바인딩 아키텍처는 포커스가 행 외부로 이동할 때까지 제약 조건 검사를 일시적으로 중단하며, BeginEdit, EndEdit, CancelEdit 메서드를 명시적으로 호출할 필요가 없습니다.
데이터 세트에서 메서드를 호출하면 Merge 제약 조건이 자동으로 비활성화됩니다. 병합이 완료되면, 데이터 세트에 사용하도록 설정할 수 없는 제약 조건이 있을 경우, ConstraintException이(가) 발생합니다. 이 상황에서는 EnforceConstraints 속성이 false,
로 설정되며 EnforceConstraints 속성을 true
로 다시 설정하기 전에 모든 제약 조건 위반을 해결해야 합니다.
업데이트를 완료한 후 제약 조건 검사를 다시 활성화하여 업데이트 이벤트를 다시 활성화하고 발생시키는 작업을 수행할 수 있습니다.
이벤트 일시 중단에 대한 자세한 내용은 데이터 세트를 채우는 동안 제약 조건 해제를 참조하세요.
데이터 세트 업데이트 오류
데이터 세트의 레코드를 업데이트하면 오류가 발생할 수 있습니다. 예를 들어, 실수로 잘못된 형식의 데이터를 열에 쓰거나, 너무 긴 데이터를 입력하거나, 다른 무결성 문제가 있는 데이터를 기록할 수 있습니다. 또는 업데이트 이벤트의 모든 단계에서 사용자 지정 오류를 발생시키는 애플리케이션별 유효성 검사가 있을 수 있습니다. 자세한 내용은 데이터 세트의 데이터 유효성 검사를 참조하세요.
변경 내용에 대한 정보 유지 관리
데이터 세트의 변경 내용에 대한 정보는 변경되었음을 나타내는 행에 플래그를 지정하고 레코드(RowState)의DataRowVersion 복사본을 여러 개 유지하는 두 가지 방법으로 유지 관리됩니다. 이 정보를 사용하면 프로세스에서 데이터 세트의 변경 내용을 확인할 수 있으며 데이터 원본에 적절한 업데이트를 보낼 수 있습니다.
RowState 속성
RowState 개체의 DataRow 속성은 특정 데이터 행의 상태에 대한 정보를 제공하는 값입니다.
다음 표에서는 열거형의 DataRowState 가능한 값을 자세히 설명합니다.
DataRowState 값 | 설명 |
---|---|
Added | 행이 DataRowCollection에 항목으로 추가되었습니다. (이 상태의 행에는 마지막 AcceptChanges 메서드가 호출되었을 때 존재하지 않았기 때문에 해당 원래 버전이 없습니다). |
Deleted | DataRow 개체의 Delete를 사용하여 행이 삭제되었습니다. |
Detached | 행이 만들어졌지만 해당 DataRowCollection행의 일부가 아닙니다. DataRow 개체는 생성된 직후, 컬렉션에 추가되기 전 및 컬렉션에서 제거된 후 이 상태에 있습니다. |
Modified | 행의 열 값이 어떤 식으로든 변경되었습니다. |
Unchanged | 행이 마지막으로 호출된 이후로 AcceptChanges 변경되지 않았습니다. |
DataRowVersion 열거형
데이터 세트는 여러 버전의 레코드를 유지 관리합니다. DataRowVersion 필드는 DataRow 에서 찾은 값을 DataRow 객체의 Item[] 속성이나 GetChildRows 메서드를 사용하여 검색할 때 사용됩니다.
다음 표에서는 열거형의 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
메서드를 호출하여 데이터 세트를 로드하는 경우 어댑터는 자동으로 변경 내용을 커밋합니다. 그러나 다른 데이터 세트를 병합하여 데이터 세트를 로드하는 경우 변경 내용을 수동으로 커밋해야 합니다.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의 사용자 입력 유효성 검사를 참조하세요.
데이터 백 엔드에서 데이터 원본(예: 데이터베이스)에 데이터를 보내고 데이터를 수락하거나 거부할 수 있도록 허용합니다. 데이터의 유효성을 검사하고 오류 정보를 제공하기 위한 정교한 기능이 있는 데이터베이스로 작업하는 경우 데이터의 원본에 관계없이 데이터의 유효성을 검사할 수 있기 때문에 실용적인 방법이 될 수 있습니다. 그러나 이 방법은 애플리케이션별 유효성 검사 요구 사항을 수용하지 못할 수 있습니다. 또한 데이터 원본이 데이터의 유효성을 검사하도록 하면 애플리케이션이 백 엔드에서 발생하는 유효성 검사 오류의 해결을 용이하게 하는 방법에 따라 데이터 원본에 대한 수많은 왕복이 발생할 수 있습니다.
중요합니다
설정된 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
문입니다. 어댑터는 RowState 속성의 값이 Modified이기 때문에UPDATE
문을 사용해야 한다는 것을 알고 있습니다.전송된 SQL 문에는
UPDATE
문이CustomerID = 'c400'
행을 대상으로 한다는 것을 나타내는WHERE
절이 포함되어 있습니다. 명령문의SELECT
이 부분은 대상 테이블의 기본 키이므로 대상 행을 다른CustomerID
모든 행과 구분합니다. 이 절에WHERE
대한 정보는 행을 식별하는 데 필요한 값이 변경된 경우 레코드의 원래 버전에서DataRowVersion.Original
파생됩니다.전송된 SQL 문에는
SET
절을 포함하여 수정된 열의 새 값을 설정합니다.비고
TableAdapter의
UpdateCommand
속성이 저장 프로시저의 이름으로 설정된 경우 어댑터는 SQL 문을 생성하지 않습니다. 대신 전달된 적절한 매개 변수를 사용하여 저장 프로시저를 호출합니다.
패스 매개 변수
일반적으로 매개 변수를 사용하여 데이터베이스에서 업데이트될 레코드의 값을 전달합니다. TableAdapter의 Update
메서드가 UPDATE
문을 실행하는 경우 매개 변수 값을 입력해야 합니다. 적절한 데이터 명령에 대한 컬렉션에서 Parameters
이러한 값을 가져옵니다. 이 경우 TableAdapter의 UpdateCommand
개체입니다.
Visual Studio 도구를 사용하여 데이터 어댑터를 생성한 UpdateCommand
개체는 문의 각 매개 변수 자리 표시자에 해당하는 매개 변수 컬렉션을 포함합니다.
각 매개 변수의 속성은 System.Data.SqlClient.SqlParameter.SourceColumn 데이터 테이블의 열을 가리킵니다. 예를 들어 SourceColumn
매개 변수 및 Original_au_id
매개 변수의 au_id
속성은 작성자 ID를 포함하는 데이터 테이블의 열로 설정됩니다. 어댑터의 Update
메서드가 실행되면 업데이트되는 레코드에서 작성자 ID 열을 읽고 값을 문으로 채웁니다.
UPDATE
문에서 새 값(레코드에 기록될 값)과 이전 값(레코드를 데이터베이스에 배치할 수 있도록)을 모두 지정해야 합니다. 따라서 각 값에는 두 개의 매개 변수가 있습니다. 하나는 SET
절에 대한 것이고, 다른 하나는 WHERE
절에 대한 것입니다. 두 매개 변수 모두 업데이트 중인 레코드에서 데이터를 읽지만 매개 변수 SourceVersion 의 속성에 따라 서로 다른 버전의 열 값을 가져옵니다. 절의 SET
매개 변수는 현재 버전을 가져오고 절의 매개 변수는 WHERE
원래 버전을 가져옵니다.
비고
일반적으로 데이터 어댑터의 RowChanging 이벤트와 관련된 이벤트 처리기 내에서 코드에서 Parameters
컬렉션의 값을 직접 설정할 수도 있습니다.