프로그래밍 노트

msado15.dll을 이용해서 MFC에서 ADO로 데이테베이스 억세스하기 본문

MFC TIP

msado15.dll을 이용해서 MFC에서 ADO로 데이테베이스 억세스하기

띠리 2007. 5. 15. 14:06
msado15.dll을 이용해서 MFC에서 ADO로 데이테베이스 억세스하기
여기서 데이터베이스는 MySQL을 썼다.
다른 데이터베이스를 쓸때는 접속 문자열을 바꾸어 주면 될 것같다.

예제는 hong 데이터베이스의 animal 테이블의 필드명과
데이터를 직접 실행 창에 출력하는 예제이다.

TRACE함수는 MFC의 함수라는 것을 이번에 처음 알았다. -.-;;


 



#include "stdafx.h"

#include "stdio.h"

#include "io.h"


// ADO DLL 임포트

#import "C:\Program files\Common Files\System\Ado\msado15.dll" no_namespace rename("EOF", "ADOEOF")


int main()

{

    HRESULT    hr;


    // COM 라이브러리 초기화

    CoInitialize(NULL);


    try {


        _ConnectionPtr    pConn;

        _RecordsetPtr    pRs;


        hr = pConn.CreateInstance(__uuidof(Connection));

        hr = pRs.CreateInstance(__uuidof(Recordset));       


        pConn->CursorLocation = adUseClient;


        // MySQL ODBC 접속 문자열

        _bstr_t strConn("DRIVER={MySQL ODBC 3.51 Driver};SERVER = localhost;DATABASE = hong;UID = hong; PWD = hong;");


        // 데이터베이스 접속

        hr = pConn->Open(strConn, "", "", adConnectUnspecified);


        // 레코드셋 설정

        hr = pRs->Open("select * from animal", pConn.GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText);



        _variant_t    vtColumn;

        _variant_t    vtNull;


        vtNull.ChangeType(VT_NULL);


        TCHAR    strDisp[MAX_PATH+1];

        short    i;

        long    nRow = pRs->Fields->Count;    // 레코드수 취득


        // 필드명 표시

        for (i = 0; i < nRow; i++)

        {

            // 필드명 취득

            vtColumn = pRs->Fields->GetItem(i)->Name;


            vtColumn.ChangeType(VT_BSTR);

            lstrcpyn(strDisp, (_bstr_t)vtColumn, MAX_PATH);


            if (i == nRow - 1) {

                TRACE("%s\n", strDisp);

            } else {

                TRACE("%s,", strDisp);

            }

        }


        pRs->MoveFirst();


        // 필드값 표시

        if(!pRs->ADOEOF)

        {

            while(!pRs->ADOEOF)

            {

                for (i = 0; i < nRow; i++)

                {

                    vtColumn = pRs->GetCollect(i);


                    // 데이터가 NULL이면 ""을 대입

                    if (vtColumn == vtNull) {

                        vtColumn = _variant_t("");

                    } else {

                        vtColumn.ChangeType(VT_BSTR);

                    }

                    lstrcpyn( strDisp, (_bstr_t)vtColumn, MAX_PATH );


                    if (i == nRow - 1) {

                        TRACE("%s\n", (LPCSTR)strDisp);

                    } else {

                        TRACE("%s,", (LPCSTR)strDisp);

                    }

                }


                pRs->MoveNext();

            }

        }


        hr = pRs->Close();



    } catch(_com_error &e) {

        _bstr_t bstrSource(e.Source());

        _bstr_t bstrDescription(e.Description());

        printf("Error:%s\n", (LPCSTR) bstrDescription);

    }

}





Comments