VB.NET 2008/VB - 데이터 액세스

데이터베이스 액세스 - 데이터 응용 프로그램과 ADO.NET

본클라쓰 2011. 4. 28. 10:05

 

Visual Studio는 데이터에 액세스하는 응용 프로그램을 만드는 과정을 돕는 많은 디자인 타임 도구를 제공한다.

 

Visual Studio에서 데이터에 액세스하는 응용 프로그램을 개발할 때의 요구 사항은 경우에 따라 다르다. 단순히 폼에 데이터를 표시해야 할 경우가 있으며 다른 응용 프로그램 또는 프로세스와 정보를 공유하는 방법을 찾아야 할 경우도 있다.

 

Visual Studio에서 응용 프로그램을 만들 때 사용하는 기본 데이터 아키텍처는 ADO.NET이다. 데이터로 수행하는 작업이 어떤 것이든, 몇 가지 기본 개념은 이해하고 있어야 한다. 데이터 처리의 세부 사항에 대해서 모두 알 필요는 없다.

 

응용 프로그램에서 데이터를 다루는 전반적인 작업은 최상위 수준의 몇 가지 프로세스로 분류할 수 있다. 예를 들어, 폼을 통해 사용자에게 데이터를 표시하려면 먼저 데이터 소스에 연결한 다음 표시할 데이터를 페치해야 한다. 이 데이터를 응용 프로그램으로 가져온 뒤에는 DataSet 또는 LINQ to SQL 개체와 같이 데이터를 임시로 저장할 곳이 필요하다.

 

일반적인 데이터 응용 프로그램에서는 다음 다이어그램에 표시된 대부분의 프로세스를 사용한다.

 

[사진출처] http://msdn.microsoft.com/ko-kr/library/0wxwcakt(v=VS.90).aspx

 

 

 

 

ADO.NET

 

ADO.NET은 OLE DB 및 ODBC를 통해 노출되는 데이터 소스, SQL Server 및 XML과 같은 데이터 소스에 대한 일관성 있는 액세스를 제공한다. 데이터 공유 소비자 응용 프로그램은 ADO.NET을 통해 이러한 데이터 소스에 연결하여 포함된 데이터를 검색, 처리 및 업데이트할 수 있다.

 

ADO.NET은 데이터 조작에 따른 데이터 액세스를 각각의 구성 요소로 구분하여 개별적으로 또는 차례대로 사용할 수 있게 해 준다. ADO.NET에는 데이터베이스에 연결하고 명령을 실행하며 결과를 검색하는 데 사용되는 .NET Framework 데이터 공급자가 포함된다. 검색된 결과는 곧바로 처리되거나 ADO.NET DataSet 개체에 저장되어 특별한 방식으로 사용자에게 노출되거나 여러 소스의 데이터와 함께 사용되거나 계층 간에 전달된다. DataSet 개체는 또한 .NET Framework 데이터 공급자를 독립적으로 사용하여 응용 프로그램에 로컬인 데이터 또는 XML에서 가져온 데이터를 관리할 수 있다.

 

 

ADO.NET에서 데이터를 액세스하고 조작하기 위한 구성 요소는 .NET Framework 데이터 공급자와 DataSet 이다.

 

 

.NET Framework 데이터 공급자

 

.NET Framework 데이터 공급자는 데이터 조작과 정방향 읽기 전용 고속 데이터 액세스를 위해 명시적으로 디자인된 구성 요소이다. Connection 개체는 데이터 소스에 대한 연결을 제공한다. Connection 개체를 사용하면 데이터베이스 명령에 액세스하여 데이터를 반환 및 수정하고 저장 프로시저를 실행하며 매개 변수 정보를 보내거나 검색할 수 있다. DataReader는 데이터 소스의 데이터에 대한 고성능 스트림을 제공한다.

 

마지막으로 DataAdapter는 DataSet 개체와 데이터 소스 사이를 연결한다. DataAdapter는 Command 개체로 데이터 소스에서 SQL 명령을 실행하여 DataSet을 데이터와 함께 로드하고 DataSet에 포함된 데이터의 변경 내용을 데이터 소스로 되돌려 조정한다.

 

다음 표에서는 .NET Framework에 포함되어 있는 데이터 공급자를 보여 준다.

 

.NET Framework 데이터 공급자   설명 
 SQL Server  SQL Server 버전 7.0 이상에 대한 데이터 액세스를 제공. System.Data.SqlClient 네임스페이스 
 OLE DB  OLE DB를 사용하여 노출된 데이터 소스에 사용. System.Data.OleDB 네임스페이스 
 ODBC  OLE DB를 사용하여 노출된 데이터 소스에 사용. System.Data.Odbc 네임스페이스 
 Oracle  Oracle 데이터 소스에서 사용. Oracle 버전 8.17 이상을 지원. System.Data.OracleClient 네임스페이스 
 EntityClient 공급자  EDM(엔터티 데이터 모델) 응용 프로그램에 대한 데이터 액세스 지원. System.Data.EntityClient 네임스페이스 

 

다음 표에서는 .NET Framework 데이터 공급자를 구성하는 네 가지 핵심 개체에 대해 설명한다.

 

 개체  설명 
 Connection  특정 데이터 소스에 연결한다. 모든 Connection 개체의 기본 클래스는 DbConnection 클래스이다. 
 Command  데이터 소스에 대해 명령을 실행한다. Parameters를 노출하고 Connection의 Transaction 범위 내에서 실행할 수 있다. 모든 Command 개체의 기본 클래스는 DbCommand 클래스이다.  
 DataReader  데이터 소스에서 앞으로만 이동 가능한 읽기 전용 데이터 스트림을 읽는다. 모든 DataReader 개체의 기본 클래스는 DbDataReader 클래스이다.  
 DataAdapter  DataSet을 채우고 업데이트 내용을 데이터 소스에 적용한다. 모든 DataAdapter 개체의 기본 클래스는 DbDataAdapter 클래스이다.

 

 

DataSet

 

ADO.NET DataSet은 데이터 소스에 관계없이 데이터에 액세스할 수 있도록 명시적으로 디자인되었다. 따라서 응용 프로그램에 로컬인 데이터를 관리하기 위해 이를 단독으로 사용하거나 다양한 여러 데이터 소스 또는 XML 데이터와 함께 사용할 수도 있다. DataSet에는 데이터 행과 열로 구성된 하나 이상의 DataTable 개체의 컬렉션뿐만 아니라 DataTable 개체의 데이터에 대한 기본 키, 외래 키, 제약 조건 및 관련 정보가 들어 있다. 

 

다음 다이어그램은 .NET Framework 데이터 공급자와 DataSet 간의 관계를 보여준다. 

 

[사진출처] http://msdn.microsoft.com/ko-kr/library/27y4ybxw(v=VS.90).aspx

 

 

DataReader 또는 DataSet 선택

 

응용 프로그램이 DataReader 또는 DataSet 중 무엇을 사용해야 할지 결정해야 하는 경우에는 응용 프로그램에 필요한 함수의 유형을 고려해야한다. DataSet를 사용하면 다음을 수행할 수 있다.

 

- 데이터를 조작할 수 있도록 응용 프로그램에서 데이터를 로컬로 캐시한다. 쿼리 결과만 읽으면 되는 경우에는 DataReader를 사용하는 것이 좋다.

- 계층 간 데이터나 XML Web Services의 데이터를 원격화한다.

- Windows Forms 컨트롤에 바인딩하거나 여러 소스의 데이터를 결합하고 연관시키는 등 데이터와 동적으로 상호 작용한다.

- 데이터 소스에 대한 개방형 연결이 필요 없는 광범위한 데이터 처리를 수행하여 다른 클라이언트가 사용하는 연결을 제거한다.

 

DataSet에서 제공하는 기능이 필요하지 않은 경우에는 DataReader로 데이터를 정방향 읽기 전용 방식으로 반환하여 응용 프로그램의 성능을 향상시킬 수 있다. DataAdapter가 DataReader를 사용하여 DataSet의 내용을 채우더라도 DataReader를 사용하면 DataSet이 사용하는 메모리를 절약할 수 있을 뿐 아니라 DataSet 내용을 만들고 채우는 데 필요한 처리 작업을 줄일 수 있어 성능을 향상시킬 수 있다.

 

 

 

 

다음 코드는 ADO.NET 데이터 공급자를 사용하여 데이터베이스에서 데이터를 검색하는 방법을 보여준다. 데이터는 DataReader에서 반환된다.

 

Imports System Imports System.Data
Imports System.Data.SqlClient

Public Class Program
    Public Shared Sub Main()

        Dim connectionString As String = GetConnectionString()
        Dim queryString As String"SELECT CategoryID, CategoryName FROM dbo.Categories;"

        Using connection As New SqlConnection(connectionString)
            Dim command As SqlCommand = connection.CreateCommand()
            command.CommandText = queryString
            Try
                connection.Open()
                Dim dataReader As SqlDataReader = command.ExecuteReader()
                Do While dataReader.Read()
                    Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", dataReader(0), dataReader(1))
                Loop
                dataReader.Close()

            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Using
    End Sub

    Private Shared Function GetConnectionString() As String
        ' To avoid storing the connection string in your code, 
        ' you can retrieve it from a configuration file.
        Return "Data Source=(local);Initial Catalog=Northwind;" _
           & "Integrated Security=SSPI;"
    End Function
End Class