BLOG main image

같은생각
From... Las

Home | Local log | Tag | Google RSS | Google analytics | Trace watch | Guestbook  
     - 잘 지내나요?
    List  

ADO 프로그래머를 위한 ADO.NET ASP.NET

ADO 프로그래머를 위한 ADO.NET ASP.NET

출처 : http://blog.naver.com/oyukihana
요약

이 문서에서는 ADO와는 대조적으로 ADO.NET을 사용하는 방법 및 ADO.NET에서 기본적인 데이터베이스 작업을 수행하는 방식에 대해 설명합니다(10페이지/인쇄 페이지 기준)

목차

.NET 기반 데이터 액세스
데이터 읽기
DataSet, DataTable 및 Recordset
기존 코드 변환
데이터 업데이트
확장된 XML 지원
요약

ADO.NET은 ODBC(Open Database Connectivity) API(Application Programming Interface)로서 데이터베이스 액세스 분야에서 최신 기술입니다. ODBC API가 소개된 이래 주목할 만한 몇 가지 사항이 있습니다. 예를 들어, COM은 데이터베이스 분야로 정착했고 OLE DB로 발전했습니다. 다음은 OLE DB의 자동화 버전으로 Visual Basic® 및 Windows® 기반 데이터베이스 개발자의 ASP 커뮤니티로 사용된 ADO(ActiveX® Data Objects)입니다.

Microsoft는 .NET을 기반으로 하는 범용 프레임워크로서 기존의 모든 Windows API를 비롯하여 다른 API도 적용할 수 있는 Framework Class Library를 제공하고 있습니다. 특히 별도의 COM 개체를 통해 사용할 수 있도록 자주 사용되는 여러 가지 라이브러리를 포함합니다. 이러한 라이브러리에서는 ADO.NET이라는 클래스의 하위 트리에 통합된 XML 및 ADO 개체 모델이 있습니다.

ADO.NET은 데이터 인식 .NET 응용 프로그램 기반을 형성하는 근본입니다. ADO와는 달리 ADO.NET은 더 일반적이면서 데이터베이스를 지향하지 않는 원칙에 따라 특별히 설계되었습니다. ADO.NET은 데이터를 처리할 수 있는 모든 클래스를 수집합니다. 이러한 클래스는 인덱스, 정렬, 뷰 등의 일반적인 데이터베이스 기능을 특징으로 하는 데이터 컨테이터를 나타냅니다. ADO.NET이 .NET 데이터베이스 응용 프로그램에 있어서 결정적인 솔루션이며 ADO 모델로서 데이터베이스 중심이 아닌 전체적인 설계를 나타냅니다.

ADO.NET은 ADO와는 완전히 다릅니다. 새로운 데이터 액세스 프로그래밍 모델로 완전한 이해, 훈련 및 다른 각도의 접근 방식이 필요합니다. 그러나 일단 ADO.NET을 접해보면, 이미 습득한 ADO 기술을 사용하여 효과적인 응용 프로그램을 설계하고 다른 방식으로 이전 문제를 해결하는 데 있어서 많은 도움이 된다는 것을 알 수 있습니다.

이 문서의 나머지 부분에서는 ADO.NET의 기본적인 데이터베이스 작업을 수행하는 방식에 대해 중점적으로 설명합니다. 이제 ADO로 작업을 하는 것 보다 ADO.NET을 선택하는 것이 더 효과적이라는 것을 알게 될 것입니다. ADO.NET은 .NET 인프라에 맞도록 적응시킨 ADO가 아닙니다. 구문, 코드 설계 및 마이그레이션의 관점에서 보면 이 점이 명백합니다.

.NET 기반 데이터 액세스

ADO.NET의 데이터 원본에 대한 액세스는 관리 공급자에 의해 결정됩니다. 관리 공급자는 다음 두가지 측면에서 기능적으로 OLE DB 공급자와 매우 비슷합니다. 첫째, .NET 환경에서 작업하며 DataReader 및 DataTable 같은 .NET 클래스를 통해 데이터를 검색하고 나타냅니다. 둘째, 아키텍처는 .NET으로 최적화되었기 때문에 더 간단합니다.

ADO.NET에는 관리 공급자의 두 가지 요소가 있는데 SQL Server™ 7.0 및 이후 버전과 설치한 다른 모든 OLE DB 공급자입니다. 이 두 가지 경우에 사용하는 클래스는 다르지만 유사한 명명 규칙을 따라야 합니다. 이름은 접두사를 제외하고 동일합니다. 전자의 경우 접두사는 SQL이고 후자의 경우는 ADO입니다.

SQL Server 테이블을 액세스하려면 OLE DB 공급자가 제공하는 중간 수준을 건너뛰어 데이터베이스 서버의 내부 API로 곧바로 이동하기 때문에 SQL 클래스를 사용해야 합니다. ADO 클래스는 OLE DB 공급자 위에 위치한 .NET 인터페이스이며 COM Interop 브리지를 사용하여 이러한 작업을 수행합니다.

ADO.NET 개체에 대한 자세한 내용은 Omri Gazitt의 기사, ADO+ 소개: Microsoft .NET Framework의 데이터 액세스 서비스 및 저자의 기사 데이터 종류의 진화를 주도하는 ADO+ 를 참조하십시오. 전자는 보다 기술적이고 ADO.NET 프로그래밍 모델의 높은 수준이며 주석이 있는 개요를 제공합니다. 후자는 ADO.NET에 대한 동기 부여 및 XML, 스크립트, 다른 기술 등과 어떻게 관련되어 있는지에 대한 설명에 중점을 두었습니다.

데이터 읽기

ADO.NET 응용 프로그램은 데이터 원본 범위 밖에 있는 일부 데이터를 읽고 연결 개체를 작성하여 시작합니다. 대상 공급자에 따라 연결 개체는 SQLConnection 또는 ADOConnection일 수 있습니다. 권장되는 사항은 아니지만 ADO.NET 클래스를 사용하여 SQL Server 데이터베이스에 연결할 수도 있습니다. 여기서 유일한 단점은 작성한 코드가 불필요한 코드 층을 통과한다는 것입니다. 코드는 ADO 관리 공급자를 호출한 다음 SQL Server OLE DB 공급자를 호출합니다. 대신에 SQL Server 관리 공급자는 OLE DB 공급자가 수행하는 것처럼 해당 데이터에 곧바로 이동할 수 있습니다.

ADO 연결 개체와 ADO.NET 연결 개체의 중요한 차이점은 ADO.NET 연결은 CursorLocation 속성을 지원하지 않습니다. 이것은 오류가 아니라 논의의 여지가 있는 설계 문제입니다. 기본적인 데이터 중심 비전을 강화할 목적으로 ADO.NET에는 명시적인 커서 구현이 없습니다.

ADO에서는 데이터베이스 범위 외에 있는 레코드 또는 그 외 다른 OLE DB 호환 데이터 원본을 가져오기 위해 커서를 사용합니다. 그리고 몇 개의 미리 정의된 커서 유형인 클라이언트 커서 또는 서버 커서를 선택합니다. 반면 ADO.NET은 데이터 원본에서 추출하여 데이터 읽기 및 분석을 위한 새로운 프로그래밍 인터페이스를 제공합니다.

ADO에서는 연결 및 명령 텍스트를 지정하여 Recordset 개체를 만듭니다. Recordset에는 커서 위치 및 유형에 대한 특정 정책이 들어 있습니다. 데이터를 읽으려면 다음 중 하나를 수행해야 합니다.

메모리 내부에 선택한 레코드의 정적 복사본을 만들고 데이터 원본과 연결이 끊긴 동안 레코드를 처리합니다. ADO는 이 정적 커서를 호출합니다.

레코드의 정적 스냅샷을 통해 수행되는 속도가 빠른 정방향 읽기 전용 커서를 사용하여 데이터를 스크롤합니다. ADO는 이 읽기 전용 커서를 호출합니다.

서버측 커서의 두 가지 요소를 사용하여 데이터를 액세스하려면 처리 중인 연결이 필요합니다. 그러나 연결되어 있는 다른 사용자가 변경한 내용을 다른 수준에서 감지할 수 있습니다. ADO는 이러한 키세트 및 동적 커서를 호출합니다.
위의 처음 두 옵션은 연결되지 않은 레코드 집합에서 작업하며 클라이언트측 캐시에서 정보를 읽는다는 점이 비슷합니다. 또한 이 두 옵션은 웹 지향 컨텍스트 및 새 n 계층 시스템에 가장 빈번하게 사용됩니다.

ADO에서 위의 옵션 모두 다른 유형의 커서와 매핑됩니다. 이 문서를 읽다보면 알겠지만 ADO.NET은 ADO와는 완전히 다르지만 이미 습득한 ADO 기술을 적용할 수 있습니다. 대조적으로, 프로그래머가 작성한 코드는 실제 데이터 원본과 물리적 저장 매체 및 형식에서 추출합니다.

ADO.NET에서는 두 가지 개체를 시용하여 데이터 원본 범위 밖에 있는 데이터를 가져와서 조작할 수 있습니다. 이 두 개체는 DataSet 개체와 DataReader 개체입니다. 전자는 자유자재로 모든 위치에서 접근하고 수정할 수 있는 메모리 내부의 레코드 캐시입니다. 후자는 고도로 최적화된 개체로 정방향 전용 방식으로 읽기 전용 레코드를 스크롤할 수 있습니다. DataSet은 정적 커서와 비슷한 반면 DataReader 개체는 ADO 읽기 전용 커서의 완전한 .NET 사본입니다.

ADO.NET에는 서버측 커서에 대한 지원이 없습니다. 그러나 서버측 커서를 사용할 수 없다는 것이 아닙니다. 이를 수행하려면 .NET의 ADO 유형 라이브러리를 가져옵니다. 이 작업은 프로젝트 창에서 References 노드를 마우스 오른쪽 단추로 클릭하는것처럼 간단합니다. 일단 이 작업을 수행하면 응용 프로그램에서 기본 ADO 개체를 사용하여 시작할 수 있습니다.

기존 응용 프로그램을 .NET으로 다시 작성하는 것이 바람직하지만 .NET 사용을 결정하는 것이 쉽지는 않습니다. 완전한 ADO의 도입은 많은 시간과 자원을 투자하지 않고 .NET 사용을 시작하기 위한 실질적인 첫 번째 단계일 수 있습니다. 이것은 수 많은 단계 중의 첫 번째 단계에 불과하지만 .NET 을 시작하는 유일한 방법입니다. .NET의 진정한 장점은 균일하고 일관성 있는 프로그래밍 인터페이스 및 광범위한 기본 클래스 사용을 기반으로 합니다. COM 유형 라이브러리 가져오기가 지원되지만 권장하지는 않습니다. 이것은 단기 솔루션 및 중간 단계에만 적합합니다.

ADO.NET은 데이터 컨테이너 클래스에 대해 프로그래밍 인터페이스를 통합한다는 점을 주목하십시오. 어떤 유형의 응용 프로그램이든 간에 Windows 폼, 웹 폼 또는 웹 서비스로 작성할 수 있으며 같은 클래스 집합을 통해 데이터를 처리할 수 있습니다. 백 엔드의 데이터 원본이 SQL Server 데이터베이스, OLE DB 공급자, XML 파일 또는 배열에 있는 것에 상관없이 같은 메서드 및 속성을 통해 컨텐트를 스크롤하고 처리할 수 있습니다.


그림 1. Solution Explorer 메뉴
.NET에서 ADO를 고집하면 데이터 바운드 컨트롤에서 사용 가능한 레코드 집합을 만들어야 하는 추가 코드와 같은 일부 부작용에 대비해야 합니다.

DataSet, DataTable 및 Recordset

ADO.NET은 Recordset 개체에 대한 완전한 사본이 없습니다. 가장 유사한 개체는 DataTable 개체입니다. 이러한 개체는 거의 동일한 기능을 가지고 있지만 각각의 프레임워크에서 다른 역할을 수행합니다.

Recordset은 큰 규모의 개체이므로 많은 ADO 기능을 포함하고 있지만 일부 영역에서는 기능이 부족합니다. 만들기 쉽고 연결이 끊긴 상태에서도 수행되며 그 외에 다양한 기능이 있습니다. 하지만 일부 영역은 여전히 개선할 점이 남아 있습니다. 예를 들어, 본래의 COM 특성 때문에 네트워크를 통해 직렬화하는 것은 막대한 작업으로, 이진 개체로서 다른 플랫폼에서 실행되는 모듈 사이를 공유하는 것이 어렵고 방화벽을 통과할 수 없습니다. 또한 단일 레코드 테이블을 나타냅니다. 이 테이블은 하나 이상의 JOIN 결과로 생성되며 본래의 데이터 원본을 업데이트하기가 어렵습니다. 연결이 끊긴 레코드 집합과 본래의 데이터 원본을 대응시키면 데이터 원본이 SQL을 인식하는 동안 수행됩니다. 그러나 레코드 집합은 SQL 공급자가 아닌 공급자에 의해 만들어집니다.

ADO.NET에서 ADO Recordset의 모든 기능은 몇 가지 간단한 개체로 분리되었습니다. 그 중 하나가 DataReader개체입니다. DataReader는 속도가 빠른 정방향 읽기 전용 커서처럼 동작을 수행합니다.

DataTable은 데이터 원본을 나타내는 간단한 개체입니다. DataTable을 수동으로 만들거나 DataSet 명령을 사용하여 자동으로 채울 수 있습니다. DataTable에서는 포함되어 있는 데이터의 출처를 알 수 없습니다. 메모리에서 데이터를 조작할 수 있으며 탐색, 정렬, 편집, 필터 적용, 뷰 만들기 등과 같은 작업을 수행할 수 있습니다.

DataSet는 사본이 없는 ADO를 위한 개체입니다. 이 개체는 데이터 컨테이너 클래스이며 ADO.NET 데이터 추상화를 인식하는 핵심 개체입니다. DataSet는 하나 이상의 DataTable 개체로 분류합니다. DataTable은 행과 열 같은 일반적인 컬렉션을 통해 컨텐트를 나타냅니다. 데이터 테이블에서 읽기를 수행할 경우 DataTableMapping 및 DataView 두 개의 다른 층을 통과해야 합니다.

DataTableMapping 개체에는 데이터 원본의 데이터의 열과 DataTable 개체 간의 매핑 설명을 포함하고 있습니다. 이 클래스는 DataSet을 채우는 경우 DataSetCommand 개체가 사용합니다. 데이터 집합에서 추상화 열과 데이터 원본의 물리적 열 간의 연결을 유지 관리합니다.

테이블 뷰는 DataView 개체를 통해 렌더링됩니다. 이것은 사용자 지정된 DataTable 뷰를 나타내고 Windows 폼 및 웹 폼의 datagrid와 같은 특수화된 컨트롤에 바운드됩니다. 이 개체는 메모리 내부의 SQL CREATE VIEW 구문에 해당합니다.

DataSet의 모든 테이블은 공통 필드를 통해 관계를 형성합니다. 관계는 DataRelation 개체가 관리합니다. 이것은 ADO 데이터 모양과 거의 같지만 한 가지 중요한 차이점이 있습니다. 데이터 모양 언어를 처리할 필요가 없으며 매우 융통성 있는 아키텍처를 제공합니다. ADO.NET 탐색 모델을 사용하여 한 테이블의 마스터 행에서 모든 해당 자식 행까지 쉽게 이동할 수 있습니다.

DataRelation 개체는 메모리 내부에 있는 JOIN문의 사본이며 같은 데이터 형식을 가진 열을 필요로 하는 부모/자식 관계를 구현하는 데 유용합니다. 일단 관계가 설정되면 관계를 해제하는 어떤 변경도 허용되지 않으며 런타임 예외가 발생합니다. 뷰 및 관계는 마스터/상세 스키마를 구현하는 메서드입니다. 뷰는 단지 레코드를 위치시키는 마스크란 것을 유념하십시오. 관계가 두 테이블에서 하나 이상의 열 사이에 동적 연결 집합이지만 관계를 사용하여 순서 또는 집합 조건을 변경할 수는 없습니다.

코드가 일 대 일(1:1) 외래 키 관계가 필요한 경우 해당 데이터를 변경하지 않고 간단한 JOIN 명령을 사용하는 것이 편리합니다. 추가적인 필터링 기능이 필요하면 ADO.NET 사용자 지정 뷰를 이용합니다.

기존 코드 변환

ADO 개체를 사용하여 데이터를 가져올 수 있는 수 많은 ASP 페이지가 있습니다. 작성한 코드를 도입하고 적용할 때 직면하게 되는 몇 가지 전형적인 시나리오를 검토해 봅시다.

단일 레코드 집합에서 보고서를 생성하는 ASP 페이지가 있는 경우 DataReader 개체가 가장 적합합니다.
DataReader를 통해 탐색하고 페이지에 출력할 수 있습니다.

String strConn, strCmd;
strConn = "DATABASE=MyAgenda;SERVER=localhost;UID=sa;PWD=;";
strCmd = "Select * From Names where ID=" + contactID.Text;
SQLConnection oCN = new SQLConnection(strConn);
SQLCommand oCMD = new SQLCommand(strCmd, oCN);
oCN.Open();
SQLDataReader dr;
oCMD.Execute(out dr);
while (dr.Read()) {
// dr.GetString(index) 또는
// dr["field name"]을 Response.Write 데이터에 사용합니다.
}

또한 HasMoreRows 속성을 사용하여 DataReader가 비어 있는지를 신속하게 확인할 수 있습니다. 그리고 단지 일련의 레코드를 처리할 경우에는 DataReader를 사용하는 것이 가장 좋은 방법입니다. 단일 레코드에 대한 쿼리가 필요한 경우 DataReader는 True(참)입니다. DataReader의 컨텐트는 편집할 수 없지만 해당 컨텐트를 보다 처리하기 쉬운 개체(예를 들어 DataTable 또는 하나 이상의 DataRow 개체)로 항상 이동할 수 있습니다.

DataReader는 테이블과 레코드 간에 복잡한 관계를 처리할 필요가 있는 경우 적합한 도구를 사용하기 위해 수행을 정지시킵니다. ADO에서는 항상 레코드 집합으로 작업을 마무리합니다. 보다 체계화된 데이터 모델일수록 더 복잡한 SQL 명령이 필요합니다. 탐색 모델은 순차적이며 필요 이상의 많은 데이터를 캐시해야 합니다. DataSet 및 DataRelation 개체는 이러한 종류의 테이블 관계 모델 기초입니다.

부모/자식 관계를 관리하기 위해 ADO는 데이터 모양 엔진을 마샬링합니다. 기능적인 측면에서 데이터 모양 및 ADO.NET 관계는 동일합니다. 그러나 설게 측면에서는 매우 다릅니다. 모양 레코드 집합은 단일 테이블 형식 개체의 모든 정보를 포함합니다. ADO.NET 관계는 두 개의 데이터 테이블 간에 언제든지 설정할 수 있는 동적 연결입니다. ADO는 모양의 OLE DB 서비스 공급자에 의존하며 단일 ADO 명령 실행 범위내에서 계층 레코드 집합을 만들기 위해 특정 SQL 부류의 언어를 다룹니다.

ADO.NET에서 관계에 필요한 각 개체는 항상 개별적으로 나타납니다. 관계 자체가 하나의 개체로 표현되며 특정 동작 지침이 주어집니다. 예를 들어, DataRelation 개체는 부모 행에서 자식 행까지 계단식으로 변경할 수 있습니다. ForeignKeyConstraint 개체를 DataTable의 제약 조건 컬렉션에 추가하여 이 작업을 수행할 수 있습니다. ForeignKeyConstraint 개체는 값 또는 행이 삭제되거나 업데이트된 경우 외래 키 관계를 통해 연결된 일련의 열에 대한 제한을 나타냅니다. 앞에서 언급했듯이 일단 관계가 설정되면 관계는 프로그램 방식으로 종료될 때까지 관계를 해제하는 변경 사항를 입력할 수 없습니다.

또한 관계는 전이되지 않습니다. 고객과 주문, 주문과 제품 같이 두 가지 다른 관계를 설정할 수 있습니다. 그러나 특정 고객에 대한 주문을 탐색하는 경우 한 주문에서 관련된 제품 행으로 이동할 수 없습니다. 원하는 주문을 찾으려면 주문/제품 관계를 개별적으로 열고 관련된 행을 요청합니다. 이와 같이 일 대 일(1:1) 관계는 이전 SQL JOIN 문을 통해 렌더링하는 것이 더 좋은 방법일 수 있습니다.

ASP 세션 개체에 레코드를 저장해야 합니까? ADO.NET 및 DataSet 개체를 사용하면 "액세스 위반이 발생할 수 있는 GIT에 ADO 레코드 집합 저장"(http://support.microsoft.com/support/kb/articles/Q249/1/75.ASP )에서 논의된 중첩 효과를 발생시키지 않을 뿐만 아니라 스레드 선호도에 고심할 필요없이 더 안전하게 수행할 수 있습니다.

데이터 업데이트

웹 응용 프로그램은 일반적으로 간단한 SQL 구문 또는 매개변수화된 저장 프로시저를 사용하여 데이터를 업데이트합니다. 그러나 연결이 끊긴 데이터를 사용할 경우 변경해야 할 모든 레코드를 업데이트하려면 내장된 서비스를 이용해야 합니다. 이 작업을 수행하기 위해 ADO는 일괄 업데이트 메커니즘을 제공합니다.

UpdateBatch 메서드는 복사 버퍼에 있는 Recordset 변경을 서버에 보내 데이터 원본을 업데이트합니다. 낙관적 유형의 잠금을 사용하며 보류 중인 모든 로컬 변경을 처리합니다. 또한 한 번의 작업으로 모든 변경 내용을 데이터 원본에 보냅니다. 데이터 원본이 변경 내용이 커밋되었을 경우에만 변경되는 레코드를 잠갔을 때 낙관적 잠금이 발생합니다. 결과적으로 두 사용자가 동시에 같은 레코드를 액세스할 수 있으며 다른 사용자에 의해 덮어쓰게 될 변경 내용을 입력할 수 있습니다. 물론 이와 같은 시도는 데이터 원본이 데이터 충돌을 감지하고 거부할 수 있을 경우에만 가능합니다. 또한 전체 데이터 원본이 비휘발성이며 빈번한 변경이 없음을 가정합니다. 그렇지 않으면, 추정된 조정 비용이 곧 비관적 잠금의 저축을 초과하게 됩니다. 사실상 UpdateBatch 메서드를 사용하여 변경 작업을 실패하면 오류가 반환됩니다. 그리고 Errors 컬렉션 및 Error 개체를 사용하여 해당 오류를 액세스할 수 있습니다.

낙관적 잠금이 ADO에서 수행되는 방법을 이해하는 것이 데이터 업데이트에 대해 ADO.NET 모델이 얼마나 강력한지를 파악하는 것에 있어서 핵심 요소입니다. ADO 코드에서 UpdateBatch를 호출하고 나머지 작업은 프로그래머가 제어할 수 없습니다. 이것은 데이터 원본의 해당하는 레코드에서 원래 값과 현재 값을 비교하여 변경된 행을 스크롤하여 서버상에서 수행되는 업데이트입니다. 모든 경우에 부합되는 경우 적합한 SQL 구문(INSERT, UPDATE 또는 DELETE)을 해당 테이블에서 수행합니다.

문제점은 변경 내용을 실질적으로 적용하는 SQL 구문을 제어할 수 없다는 것입니다. 프로그래머가 작성한 코드가 서버측 업데이트 코드보다 더 적합하며 SQL 공급자가 아닌 공급자를 대상으로 할 경우 수행하지 않습니다. 이 절의 시작 부분에 매개변수화된 저장 프로시저를 통해 웹 응용 프로그램이 데이터를 업데이트한다는 것을 언급했습니다. 그러나 일괄 업데이트를 사용할 경우에는 해당되지 않습니다.

ADO.NET에서 이러한 모델은 많이 확장되었습니다. 즉, 보다 일반적인 스키마가 삽입, 삭제, 업데이트 및 선택 같은 기본 작업에 대해 명령을 지정할 수 있도록 해줍니다. 데이터 원본의 특성에 상관없이 데이터 원본에서 추출한 데이터를 쉽게 볼 수 있으며 동일한 지원을 제공합니다. ADO.NET에서 일괄 업데이트를 수행하려면 SQLDataSetCommand 또는 ADODataSetCommand같은 DataSetCommand 개체를 만들어야 합니다.

참고 Beta 2에서 DataSetCommand 개체는 DataAdapter 개체라고도 합니다.

일단 DataSetCommand 개체를 보유하면 Update 메서드를 호출합니다. DataSetCommand는 InsertCommand, DeleteCommand, UpdateCommand 및 SelectCommand와 같은 속성을 나타냅니다. 이와 같은 개체는 Command 개체지만 기본 동작이 수행되지 않는 경우를 제외하고 설정할 필요가 없습니다. 이 사항은 ADO에서도 동일합니다. Update를 수행하는 동안 모든 xxxCommand 속성이 설정되지 않았지만 기본 키 정보가 있을 경우 Command 개체가 자동으로 생성됩니다. 이 작업을 수행하기 위해서는 데이터 테이블에 관련된 기본 키를 보유해야 합니다.

다음 코드는 DataSet의 EmployeesList 테이블에 대한 기본 키를 설정하는 방법입니다.
DataColumn[] keys = new DataColumn[1];
keys[0] = m_oDS.Tables["EmployeesList"].Columns["EmployeeID"];
m_oDS.Tables["EmployeesList"].PrimaryKey = keys;

기본 키는 원래 DataColumn 개체의 배열입니다.

테이블을 업데이트하기 위해 저장 프로시저를 사용할 경우 또는 SQL 데이터 공급자가 아닌 공급자에서 작업하고 있는 경우에는 이러한 command 속성을 자주 만들어야 합니다.

확장된 XML 지원

ADO에서 XML은 입력 및 출력 형식에 불과합니다. 그러나 ADO.NET에서 XML은 데이터의 조작, 재조직, 공유 및 전송하는 수단을 제공하는 데이터 형식입니다. DataSet에 가져온 모든 데이터를 출처에 관계없이 이중 방식 프로그래밍 모델을 통해 조작할 수 있습니다. 즉, XML 문서 개체 모델을 사용하여 비순차적이고 계층적 경로를 통해서 또는 일련의 정보를 행에서 행으로 차례로 액세스할 수 있습니다.

DataSet은 XML 문서로서 데이터 및 스키마를 읽고 작성합니다. 데이터 및 스키마 모두 HTTP 통해 전송할 수 있으며 XML을 인식하는 모든 플랫폼에서 사용될 수 있습니다. 동일한 데이터는 다른 시간에 다른 스키마(XSLT는 출구를 찾습니다.)를 통해 렌더링될 수 있습니다. ReadXmlSchema 메서드를 사용하여 스키마를 작성합니다. XML 스키마는 데이터 집합에서 테이블의 설명 및 해당 관계와 제약 조건을 포함합니다. 이 작업은 DataSet을 채우는 ReadXmlData 메서드에 호출하기 전에 수행해야 합니다.

다음 코드는 업데이트할 수 있는 데이터 테이블을 표시하는 매우 작은 규모의 ASP.NET 페이지입니다.
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>

<script runat="server" language="C#">
void Page_Load(Object source, EventArgs e)
{
DataSet data = new DataSet();

// XML 데이터 및 스키마를 로드합니다.
StreamReader sr;
sr = new StreamReader(Server.MapPath("data.xml"));
data.ReadXml(sr);
sr.Close();

// URL을 통과한 새 레코드를 추가합니다.
if (Request.QueryString.Count >0)
{
DataTable dt = data.Tables[0];
DataRow dr = dt.NewRow();
dr["FirstName"] = Request.QueryString["First"];
dr["LastName"] = Request.QueryString["Last"];
dt.Rows.Add(dr);
dt.AcceptChanges();

StreamWriter sw;
sw = new StreamWriter(Server.MapPath("data.xml"));
data.WriteXml(sw);
sw.Close();
}

// UI를 새로 고칩니다.
grid.DataSource = data.Tables[0].DefaultView;
grid.DataBind();
}
</script>
그림 2.에서 알 수 있듯이 테이블에 새 행을 추가할 수 있습니다. 그러나 테이블 뒤에 SQL Server 또는 Access 테이블이 없습니다. 이것은 테이블에 대해 수행하는 해당 코드에 있는 XML 파일이며 XML 노드 또는 XMLDOM 메서드의 기록이 없습니다. 데이터 테이블의 동일한 직관적인 인터페이스를 사용하여 XML 레코드를 읽고 업데이트합니다. ADO에서도 거의 동일한 작업을 수행할 수 있지만 여기에 있는 모델은 한층 더 체계적이고 포괄적이며 강력합니다.

그림 2. 업데이트할 수 있는 테이블 예제

요약

웹 응용 프로그램의 성공은 일반적인 분산 시스템의 구조를 바꾸었습니다. 이제 대부분의 분산 시스템은 확장성 및 상호 운용성을 필수로 하는 고도로 특성화된 n 층 시스템입니다. 따라서 데이터 연결 끊기 및 XML은 최선의 시도였으며 산업계에서도 큰 호응을 얻었습니다.

ADO.NET은 .NET의 토대로 몇 가지 요소를 통합하기 위한 연구를 계속하고 있습니다. 데이터 액세스의 전체적인 프로그래밍 모델은 포괄적이며 매우 강력합니다. 모델이 모든 개별적인 요구에 부합될 수는 없지만 모델 설계를 시작하는 아주 중요한 첫 단계라 볼 수 있습니다. 그러나 ADO.NET은 베타 버전이므로 설명서 지원만 합니다.

ADO 프로그래머는 ADO.NET의 많은 측면에 익숙하기 때문에 최고 수준의 모델을 추상화하고 고안하는 데 많은 도움을 얻을 수 있습니다. ADO.NET 코드는 기존 ADO 코드와 호환되지 않지만 기능은 비슷합니다. ADO.NET의 모든 기능을 이용하려면, 코드를 사용하는 빠른 방법을 이해하는 것보다 ADO.NET 개념을 이해하는 것이 중요합니다. 선택한 .NET 프로그래밍 모델이 Windows 폼, 웹 폼 또는 웹 서비스에 상관없이 ADO.NET은 데이터 액세스 문제를 해결해 줄 것입니다.

Category : My page/Sql & Asp   Tag :  
2007/07/28 13:38   By Las 
Trackback : Comment

Trackback Address :: http://asperados.byus.net/home/board/tt/trackback/215

Name Password Home Secret Submit

prev page next page
1  ..43 44 45 46 47 48 49 50 51 .. 238 

Recent Entry

Recent Comment

Recent Trackback

Counter

Total : 259513 Today : 14 Yesterday : 71

Tag cloud

..., ......ing, ActiveX 삭제, ADO, ADO 성능 높이기, agp, Aids, Another World, apple cinema, asp, Aya Ueto, A형, Baldurs Gate, bard, BEO Player, Book, Bryan adams, CGV, Chante Moore, clie, compact, Compilation, Convert, DAO, dao에서 ADO로, DarkNamer, datetime, DB restore, DB 복구, db 테이블 정의서, dell 2007WFP, DreamFall: The Longest Journey, dvd, DVD 타이틀, ecotonoha, eve-online, event.keyCode 번호표, Facebook, favicon, favis, Faye Wong, FLASH, Fon, Fon Lafontenna, fon maps, FON 지향성 안테나, footnote, Fun, Game, Gamecube, game_ost, GETDATE, Google, Google analytics, Graphic card, hanami, HDTV 수신카드, heaven, HijackThis, I-RAM, i4R, IceWind Dale, IE ActiveX, IE Plug-in, IETOY, include, irc, ishihara satomi, isNull, Java, JavaScript, jazz, join update, j_drama, j_music, kav, kb917422, Kenny G, keyboard_Fun, k님, Launcher, LightBox2, Linked Server, linux, Lottery Music, M.Friends, Maki Horikita, Matsu Takako, mdb, MDB생성, MDB압축, Microsoft iPod, mp3, mp3 Media Player, MSN Live, MSN Messenger, Mssql, Myminicity, NEC, NeverwinterNights, o-game, ogame, one more time, Open Your Eyes, opencapture, openTTD, PageDefrag, palm, pc_game, pc_game_tip, PC업그레이드, Pda, Petit Launcher, picture, pinball, Pink Floyd, program, ps3, punkbuster, RAID, RDO, Remake, retrievr, Review, Search, settler, settler2, skt 포인트소멸, songlist, sony usm2gj, spread, SqL, Starry Night, sudoku, Symphonic, THE ERASER, The Father, The isley brothers, thecheat, theinquirer, Think, THOM YORKE, Time, tip, Tistory, tracewatch, Twitter, ubuntu, Uchiyama Rina, Ueto Aya, UltraMon, unplugged, us and them, util, ux50, vangard, vb, wallpaper, Web관련, Wii, WOW, xirc, xp install, yui, Yumiko Shaku, z22, Zoo 愛をください, Zune, クロサギ, ソニン, 上戸彩, 優香, 我願意, 王菲, 王靖雯, 白い影, 가상주민등록번호, 강릉, 건슈팅, 검색로봇, 고냥군, 괴물, 구입기, 그해 여름, 그해여름 OST, 기억상실, 기억속의 인물, 김연아, 꿈 속에 살아가다, 난수 발생, 날개셋, 날씨, 내캐릭, 내컴퓨터, 놀자, 다랭이, 다스베이더, 다케우치 유코, 당신은 사랑받기 위해 태어난 사람, 더워, 데이터가져오기, 독백, 동생, 듀얼모니터, 레지스트리 청소, 로또, 로코모션, 마마님, 머리속, 메타정보, 미완료작업물, 밀란쿤데라, 바탕화면 아이콘을 줄이자, 박x무당님, 범프키, 보안카드, 북다트, 블랙잭, 뿌리를찾아서, 사제, 삼돌이, 삼벌식, 삽질의 현장, 생각, 생활의 지혜, 설명, 성격, 세계 AIDS의날, 소닌, 스타더스트, 스티브잡스, 스팸댓글, 시스템, 신동우, 신승훈, 실시간알리미, 싸이월드 플러그인, 안나님, 언락, 업데이트, 연애편차치, 영화를 보다, 오소영, 옥션광고, 와라님, 외장하드, 우에토 아야, 웨군, 웹표준, 유용한 소스, 유카, 윤창군, 음악저작권법, 이동성, 이벤트당첨, 이사, 이승환 9집, 이자람, 인희, 일본연예인, 자바스크립트 코드 작성법, 자식창에서 부모창 함수 사용, 잘지내나요?, 잡담, 저장프로시저, 정규식, 젠장!!!, 족보, 즐거운인생, 지름, 천안전씨, 추억과 이야기들, 카툰, 칼리브레이션, 캡쳐, 컴터 다운, 컴터업, 케로로중사 중에서, 키트님, 태양의노래 OST, 테더스킨, 테터툴즈, 투명한얼음, 트랙백놀이, 트릭, 특성, 파일이름바꾸기, 파코즈, 편한사람, 플러그인, 하고싶어, 한국 지도 서비스, 한글입력기, 함수모음, 향수, 혈액형, 혼자놀기, 후회,