본문 바로가기

c c++ mfc

ADO (ActiveX Data Objects) 이해하기 및 예제 (VBScript, C#, C++)

반응형

안녕하세요! 오늘은 데이터 액세스 프레임워크 중 하나인 ADO(ActiveX Data Objects)에 대해 알아보도록 하겠습니다. 데이터베이스와 상호 작용하는 애플리케이션을 개발할 때 중요한 개념입니다. 

저는 실제로 MFC/C++ 을 사용하여 개발중에 DB접근을 위해 사용해오고 있습니다.

ADO란?

ADO는 마이크로소프트에서 제공하는 컴포넌트 기반의 데이터 액세스 프레임워크로, 데이터 소스와 상호 작용하기 위한 기능을 제공합니다. ADO는 COM(컴포넌트 객체 모델) 기반으로 개발되어 있으며, 다양한 프로그래밍 언어 (예: Visual Basic, C++, C# 등) 와 환경에서 사용할 수 있습니다.

ADO의 구성 요소

ADO는 여러 개의 객체 모델 간의 상호 작용을 통해 데이터 액세스를 제공합니다. ADO의 주요 객체 모델은 다음과 같습니다.

  1. Connection 객체: 데이터 소스와의 연결을 설정하고 관리하는 객체입니다. 데이터베이스에 대한 연결을 열고 닫거나, 연결된 데이터 소스에 대한 트랜잭션을 관리합니다.
  2. Command 객체: SQL 쿼리, 저장 프로시저, 테이블 등을 실행하거나 호출하는 객체입니다. Command 객체는 Connection 객체를 사용하여 데이터 소스와 통신하며, 결과 집합을 Recordset 객체로 반환할 수 있습니다.
  3. Recordset 객체: 데이터 소스에서 반환되는 결과 집합을 관리하는 객체입니다. Recordset 객체는 커서를 사용하여 데이터를 순회하고, 필요에 따라 데이터를 추가, 수정, 삭제할 수 있습니다.
  4. Parameter 객체: 동적 쿼리 및 저장 프로시저에 전달되는 매개변수를 나타냅니다. Command 객체에서 사용되며, Parameter 객체를 통해 SQL 쿼리 및 저장 프로시저에서 사용할 값을 지정할 수 있습니다.
  5. Field 객체: Recordset 내의 개별 필드(컬럼)에 대한 세부 정보 및 값에 액세스하는 데 사용됩니다.
  6. Error 객체: 데이터 액세스 도중 발생하는 오류에 대한 정보를 담고 있습니다. 일반적으로 Errors 컬렉션을 통해 여러 오류를 관리하며, Connection 및 Command 객체에서 발생한 오류를 확인할 수 있습니다.

ADO 사용 예제 (VBScript)

이제 ADO의 기본 개념을 알아봤으니, 간단한 VBScript 예제를 통해 실제 사용 방법을 살펴보겠습니다. 이 예제에서는 SQL Server와 연결하고, 데이터를 조회하는 과정을 통해 ADO의 사용 방법을 이해할 수 있습니다.

 

Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

conn.ConnectionString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=myDatabase;User Id=myUsername;Password=myPassword;"
conn.Open

rs.Open "SELECT * FROM myTable", conn

Do Until rs.EOF
    WScript.Echo rs.Fields("myColumn").Value
    rs.MoveNext
Loop

rs.Close
conn.Close

이 코드는 Connection 객체와 Recordset 객체를 생성하고, ConnectionString을 설정한 후 데이터베이스와 연결을 맺습니다. 그 후, SQL 쿼리를 실행하고 결과를 Recordset 객체로 받아, 해당 결과를 출력한 다음 연결을 종료합니다.

 

ADO 사용 예제 (C#)

필요한 라이브러리 참조 추가

먼저, ADO를 사용하기 위해 필요한 라이브러리를 참조해야 합니다. 프로젝트에 다음과 같이 System.Data 네임스페이스와 System.Data.SqlClient 네임스페이스를 추가합니다.

using System.Data;
using System.Data.SqlClient;

데이터베이스 연결

데이터베이스와 연결을 설정하려면, Connection 객체를 생성하고, 연결 문자열을 지정한 후 연결을 엽니다.

string connectionString = "Data Source=(local);Initial Catalog=myDatabase;User Id=myUser;Password=myPassword;";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

데이터 조회

데이터를 조회하려면, SqlCommand 객체를 생성하여 실행할 SQL문 또는 저장 프로시저를 지정한 후 실행합니다. SqlDataReader 객체를 사용하여 결과 집합을 순회할 수 있습니다.

string selectSql = "SELECT * FROM myTable";
SqlCommand command = new SqlCommand(selectSql, connection);
SqlDataReader reader = command.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine(reader["myColumn"]);
}

reader.Close();

데이터 수정, 삭제, 추가

데이터를 삽입, 수정, 삭제하려면, SqlCommand 객체를 사용하여 SQL문을 실행한 후 ExecuteNonQuery() 메서드를 호출합니다. 이 메서드는 영향받은 레코드의 수를 반환합니다.

string insertSql = "INSERT INTO myTable (myColumn) VALUES ('myValue')";
SqlCommand insertCommand = new SqlCommand(insertSql, connection);
int insertedRows = insertCommand.ExecuteNonQuery();
Console.WriteLine($"{insertedRows} row(s) inserted.");

string updateSql = "UPDATE myTable SET myColumn = 'newValue' WHERE myColumn = 'myValue'";
SqlCommand updateCommand = new SqlCommand(updateSql, connection);
int updatedRows = updateCommand.ExecuteNonQuery

ADO 사용 예제 (C++)

개발환경 설정

  • "Visual Studio"를 실행하고 "새 프로젝트 만들기"를 선택합니다.
  • "Windows" > "기타 프로젝트 형식"을 선택한 다음, "Empty Project (C++용)"을 선택하고 "프로젝트 생성"을 클릭합니다.
  • 솔루션 탐색기에서 프로젝트 항목에 마우스 오른쪽 버튼을 클릭하고 "속성"을 선택합니다.
  • 구성 속성 > C++ > 일반의 "Additional Include Directories" 항목에 다음 디렉토리를 추가합니다.
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
  • 구성 속성 > 링커 > 일반의 "Additional Library Directories" 항목에 다음 디렉토리를 추가합니다.
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib
  • 구성 속성 > 링커 > 입력의 "추가 종속성" 항목에 다음 라이브러리를 추가합니다.
msado15.lib
  • 솔루션 탐색기에서 프로젝트 항목에 마우스 오른쪽 버튼을 클릭하고 "새 항목 추가"를 선택한 다음 "C++ 파일(.cpp)"을 추가합니다.

코드 작성

  • 생략된 다음의 헤더를 시작으로 ADO를 설정하고 사용하기 위한 코드를 추가합니다:
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <windows.h>
#include <comutil.h>
#include <comdef.h>
#include <iomanip>
#include "assert.h"

#import "C:\\Program Files (x86)\\Common Files\\system\\ado\\msado15.dll" no_namespace rename("EOF", "EndOfFile")

메인 코드에서는 ADO 객체를 초기화하고 사용할 수 있습니다.

 

  • 다음 코드는 메인 함수에 대한 예제입니다:
int main()
{
    ::CoInitialize(NULL);

    try
    {
        _ConnectionPtr pConn("ADODB.Connection");
        _RecordsetPtr pRS("ADODB.Recordset");

        pConn->ConnectionString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=myDatabase;User Id=myUser;Password=myPassword;";
        pConn->Open("", "", "", adConnectUnspecified);

        pRS->Open("SELECT * FROM myTable", _variant_t((IDispatch*)pConn, true), adOpenKeyset, adLockOptimistic, adCmdText);

        if (!pRS->EndOfFile)
        {
            pRS->MoveFirst();
            while (!pRS->EndOfFile)
            {
                printf("Column value: %s\n", (char*)_bstr_t(pRS->Fields->GetItem("myColumn")->Value));
                pRS->MoveNext();
            }
        }

        pRS->Close();
        pConn->Close();
    }
    catch (_com_error &e)
    {
        printf("Error:\n");
        printf("Code = %08lx\n", e.Error());
        printf("Message = %s\n", e.ErrorMessage());
        printf("Source = %s\n", (char*)e.Source());
        printf("Description = %s\n", (char*)e.Description());
    }

    ::CoUninitialize();
}
  • 이 코드는 ADO를 사용하여 SQL Server 데이터베이스에 연결한 후 데이터를 조회하고 출력합니다. 데이터베이스 연결이 완료되면 연결을 닫습니다. 데이터베이스 액세스 중 발생한 오류는 catch 블록에서 처리합니다.
  • 디버그 또는 릴리스 설정으로 코드를 빌드하고 실행

정리

ADO는 데이터 소스와 상호 작용하는 애플리케이션 개발에 중요한 역할을 합니다. 마이크로소프트에서 제공하는 ADO를 이용하면 일관된 인터페이스를 통해 다양한 데이터 액세스 작업을 수행할 수 있습니다. 이를 통해 데이터베이스 애플리케이션을 보다 효과적으로 작성할 수 있습니다.

이상으로 ADO에 대한 설명을 마치겠습니다. 본 내용이 개발에 유용하게 사용되길 바랍니다.

감사합니다!

반응형