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

데이터베이스 액세스 - ADO.NET에서 데이터 검색 및 수정

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

 

데이터베이스 응용 프로그램의 기본 기능은 데이터 소스에 연결하여 포함된 데이터를 검색하는 것이다. ADO.NET의 .NET Framework 데이터 공급자는 응용 프로그램의 데이터 소스를 연결하여 DataReader 또는 DataAdapter를 통해 데이터 검색 뿐 아니라 명령 실행을 돕는다. 모든 데이터베이스 응용 프로그램의 한 가지 핵심 기능은 데이터베이스에 저장된 데이터를 업데이트하는 것이다. ADO.NET에서 데이터를 업데이트하려면 DataAdapter, DataSet 및 Command 개체를 사용해야 하며 트랜잭션도 사용해야 할 수 있다.

 

 

 

데이터 소스에 연결

 

ADO.NET에서는 연결 문자열에 필요한 인증 정보를 제공함으로써 Connection 개체를 사용하여 특정 데이터 소스에 연결한다. 사용하는 Connection 개체는 데이터 소스의 형식에 따라 다르다.

 

.NET Framework에 포함된 각 .NET Framework 데이터 공급자에는 DbConnection 개체가 있다. 즉, .NET Framework Data Provider for OLE DB에는 OleDbConnection 개체가 포함되어 있고, .NET Framework Data Provider for SQL Server에는 SqlConnection 개체가, .NET Framework Data Provider for ODBC에는 OdbcConnection 개체가, .NET Framework Data Provider for Oracle에는 OrcleConnection 개체가 포함되어 있다.

 

 

 

SQL Server 연결

 

.NET Framework Data Provider for SQL Server에서는 OLE DB(ADO) 연결 문자열 형식과 유사한 연결 문자열 형식을 지원한다. 유효한 문자열 형식 이름 및 값은 SqlConnection 개체의 ConnectionString 속성을 참조해야 한다. SqlConnectionStringBuilder 클래스를 사용하여 런타임에 구문상 유효한 연결 문자열을 만들 수도 있다.

 

ConnectionString 속성을 사용하여 데이터베이스에 연결하는 일반적인 연결 문자열은 다음과 같다.

 

"Persist Security Info=False;Integrated Security=true;Initial Catalog=Northwind;server=(local)"

 

연결 문자열은 설정된 후 바로 구문 분석된다. 구문 분석을 할 때 구문에서 오류가 발견되면 ArgumentException와 같은 런타임 오류가 생성된다. 다른 오류는 연결을 열려는 시도가 있을 때에만 발견된다.

 

연결 문자열의 기본 형식에는 세미콜론으로 구분된 일련의 키워드/값 쌍이 들어 있다. 등호(=)는 각 키워드 및 해당 값을 연결한다. 세미콜론, 작은따옴표 문자 또는 큰 따옴표 문자가 들어 있는 값을 포함하려면 해당 값을 큰 따옴표로 묶어야 한다. 값에 세미콜론과 큰따옴표 문자가 모두 포함되어 있는 경우 해당 값을 작은따음표로 묶을 수 있다. 키워드는 대/소문자를 구분하지 않는다.

 

다음 표는 ConnectionString 내의 키워드 값에 유효한 이름을 보여준다.

 

 키워드   설명 
 Application Name  응용 프로그램 이름이 제공되지 않으면 응용 프로그램의 이름이거나, '.NET SqlClient 데이터 공급자'이다.
 Async  true이면 비동기 작업을 지원한다.   
 Connect Timeout  시도를 종료하고 오류를 생성할 때까지 서버에 대한 연결을 대기하는 시간(초)이다.  
 Data Source

 연결한 SQL Server 인스턴스의 이름이나 네트워크 주소. 서버 이름 뒤에 포트 버호를 지정할 수 있다. 

server=tcp:servername, portnumber 

 Encrypt  true인 경우 SQL Server에서는 서버에 인증서가 설치되어 있으면 클라이언트와 서버 사이에 전송되는 모든 데이터에 대한 SSL 암호화를 사용한다.  
 Database  데이터베이스 이름 
 Packet Size  SQL Server 인스턴스와 통신하는 데 사용하는 네트워크 패킷의 크기 
 pwd  로그온할 SQL Server 계정에 대한 암호 
 User ID  SQL Server 로그인 계정이다.  
 Workstation ID  SQL SErver에 연결하는 워크스테이션의 이름 

 

 

SqlConnectionStringBuilder 클래스 사용

 

연결 문자열 작성기를 사용하면 개발자가 프로그래밍 방식으로 구문상 올바른 연결 문자열을 만들고, 클래스의 속성과 메서드를 사용하여 기존의 연결 문장을 구문 분석 및 다시 작성할 수 있다.

 

Dim builder As New System.Data.SqlClient.SqlConnectionStringBuilder
builder("Data Source") = "(local)"
builder("Integrated Security") = True
builder("Initial Catalog") = "AdventureWorks;NewValue=Bad"

 

' Assumes connectionString is a valid connection string.
Using connection As New SqlConnection(builder.connectionString)
    connection.Open()
    ' Do work here.
End Using

 

 

 

연결 이벤트

 

모든 .NET Framework 데이터 공급자에는 데이터 소스에서 정보 메시지를 검색하거나 Connection 상태의 변경 여부를 판단하는 데 사용할 수 있는 두 가지 이벤트가 포함된 Connection 개체가 있다.

 

이벤트   설명 
 InfoMessage  정보 메시지가 데이터 소스에서 반환될 때 발생한다. 정보 메시지는 예외가 throw되지 않는 데이터 소스의 메시지이다.  
 StateChange  Connection 상태가 변경될 때 발생한다.

 

 

 

명령 실행

 

데이터 소스에 대한 연결을 설정한 후 DbCommand 개체를 사용하여 명령을 실행하고 데이터 소스에서 결과를 반환할 수 있다. 명령은 현재 사용하는 .NET Framework 데이터 공급자의 명령 생성자 중 하나를 사용하여 만들 수 있다.

 

 

명령   반환값 
 ExecuteReader  DataReader 개체를 반환
 ExecuteScalar  단일 스칼라 값을 반환
 ExecuteNonQuery  어떠한 행도 반환하지 않는 명령을 실행 
 ExecuteXMLReader  XmlReader를 반환. SqlCommand 개체에만 사용할 수 있다.  

 

 

 

아래는 데이터베이스에서 단일 값을 가져오는 간단한 예제이다.

 

Public Function AddProductCategory(ByVal newName As String, ByVal connString As String) As Integer
    Dim newProdID As Int32 = 0
    Dim sql As String = _
     "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); " _
       & "SELECT CAST(scope_identity() AS int);"

    Using conn As New SqlConnection(connString)
        Dim cmd As New SqlCommand(sql, conn)
        cmd.Parameters.Add("@Name", SqlDbType.VarChar)
        cmd.Parameters("@Name").Value = newName
        Try
            conn.Open()
            newProdID = Convert.ToInt32(cmd.ExecuteScalar())
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Using

    Return newProdID
End Function