본문 바로가기

Windows/MFC

Bible ADODB Connect

[code]
private:
    _ConnectionPtr pConnection;
    void ConnectDatabase();
[/code]

[code]
void CADOTestDlg::ConnectDatabase()
{
    HRESULT hr = CoInitialize(0);
    _bstr_t     strProvider("PROVIDER=SQLOLEDB;SERVER=127.0.0.1;UID=sa;PWD=admin;DATABASE=OLEDB");

    pConnection.CreateInstance("ADODB.Connection");
    hr = pConnection->Open(strProvider,"","",NULL);
}
[/code]

위의 연결 문자열에서 SQL 클라이언트 유틸리티의 TCP/IP 셋팅 없이 원격 데이터 베이스를 연결 할려면 다음과 같은 문자열을 더 추가 하면 된다..
[code]“Network Address=203.239.102.64,1433;Network Library=DBMSSOCN”[/code]
위이 코드 에서 눈여겨 볼 것은 Connection 객체의 새성 코드이다.
Visual Basic 이나 ASP 에서의 ADO객체 생성 기본 코드는 다음과 같을 것이다.

[code]
_RecordsetPtr rs("ADODB.Recordset");
_RecordsetPtr rs;
rs.CreateInstance("ADODB.Recordset")
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(_Recordset));
[/code]

CADOTestDlg 클래스의 OnInitDialog() 함수에서 리스트 컨트롤을 초기화 시켜주는 코드와 ConnectDatabase() 함수를 호출 하는 코드를 첨가 하자.

[code]
BOOL CADOTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    ………………..
    // TODO: Add extra initialization here
    ConnectDatabase();
    m_ctlDataList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
    m_ctlDataList.InsertColumn(0,"고객번호",LVCFMT_CENTER,100);
    m_ctlDataList.InsertColumn(1,"고객이름",LVCFMT_CENTER,100);
    m_ctlDataList.InsertColumn(2,"고객전화번호",LVCFMT_CENTER,100);

    return TRUE; // return TRUE unless you set the focus to a control
}
[/code]

CADOTestDlg 클래스에 WM_CLOSE 이밴트를 오버라이드 하여 다음과 같이 연결 된 DB 를 닫아 준다.

[code]
void CADOTestDlg::OnClose()
{
    // TODO: Add your message handler code here and/or call default
    pConnection->Close();
    CDialog::OnClose();
}
[/code]

ADO 의 SELECT 는 어떻게 이루어 지는지 알아 보자.
클래스 위자드에서 SELECT 버튼(IDC_BUTTON_SELECT) 에 BN_CLICKED 이벤트를 매핑해서 다음과 같이 코딩 한다.

[code]
void CADOTestDlg::OnButtonSelect()
{
    // TODO: Add your control notification handler code here
    _RecordsetPtr    pRs = NULL;
    _variant_t        v_bufferdata;
    _bstr_t            str_Query;
    int i_RecCount;
    int i = 0;
    HRESULT hr = CoInitialize(0);

    str_Query = "select * from v_customer";
    pRs.CreateInstance(__uuidof(Recordset));

    pRs->CursorLocation = adUseClient;
    hr = pRs->Open((_variant_t)str_Query,
            _variant_t((IDispatch *)pConnection,true), adOpenKeyset,
            adLockReadOnly, adCmdText);
    i_RecCount = pRs->RecordCount;
    m_ctlDataList.DeleteAllItems();

    if(!FAILED(hr))
    {
        for(i ;i < i_RecCount ;i++)
        {
            v_bufferdata = pRs->Fields->GetItem((LONG)0)->GetValue();
            m_ctlDataList.InsertItem(i,(LPCSTR)(_bstr_t)v_bufferdata,0);

            v_bufferdata = pRs->Fields->GetItem((LONG)1)->GetValue();
            m_ctlDataList.SetItemText(i,1,(LPCSTR)(_bstr_t)v_bufferdata);

            v_bufferdata = pRs->Fields->GetItem((LONG)2)->GetValue();
            m_ctlDataList.SetItemText(i,2,(LPCSTR)(_bstr_t)v_bufferdata);

            pRs->MoveNext();
        }
    }
    pRs->Close();
}
[/code]

레코드 셋 객체의 Open() 메소드의 두번째 파라미터에서는 COM Interface Connection 객체를 (IDispathch*) 를 통해 Cast 하였다.
이번에는 리스트 컨트롤에 데이터를 표시해 줄 때 앞선 예제와는 다르게 레코드 카운트 만큼의 for Loop 를 이용 하였다.
레코드셋의 EOF 속성을 이용 한다면 다음과 같은 코드가 나올 것이다.

[code]
if(!FAILED(hr))
{
    while(!pRs->adoEOF)
    {

        v_bufferdata = pRs->Fields->GetItem((LONG)0)->GetValue();
        m_ctlDataList.InsertItem(i,(LPCSTR)(_bstr_t)v_bufferdata,0);

        v_bufferdata = pRs->Fields->GetItem((LONG)1)->GetValue();
        m_ctlDataList.SetItemText(i,1,(LPCSTR)(_bstr_t)v_bufferdata);

        v_bufferdata = pRs->Fields->GetItem((LONG)2)->GetValue();
        m_ctlDataList.SetItemText(i,2,(LPCSTR)(_bstr_t)v_bufferdata);
        i++;
        pRs->MoveNext();
    }
}
[/code]

결과는 같이 나오지만 데이터 량이 많은 경우는 Loop 시에 레코드셋의 EOF 값을 체크하는 것보다 레코드 카운트 수 를 알아 내어 Loop 를 돌리는 것이 어플리케이션 입장에서 보면 속도가 더 빠르다.
컴파일 해서 실행시켜 리스트 컨트롤의 데이터를 확인해 보자.

그림 2(ADOTest_2.bmp)
ADO 의 INSERT 기능을 구현 하기 위한 Dialog(IDD_DIALOG_INSERT) 하나늘 추가 하고 다음과 같이 디자인 한다.

그림 3(ADOTest_3.bmp)

번호    구분    컨트롤    속성
1    Group Box    IDC_STATIC    -General TAB
Caption :
2    Static Text    IDC_STATIC    -General TAB
Caption : 이름
-Styles TAB
Align Text : Center
Center Vertically 체크
-Extended Styles
Client edge 체크
3    Edit Box    IDC_EDIT_NAME
4    Static Text    IDC_STATIC    -General TAB
Caption : 전화번호
-Styles TAB
Align Text : Center
Center Vertically 체크
-Extended Styles
Client edge 체크
5    Edit Box    IDC_EDIT_TEL

클래스 위자드를 실행 시켜 CDlgInsert 라는 클래스를 하나 추가 하고
다음과 같이 클래스위자드에서 컨트롤 멤버변수를 매핑한다.
컨트롤    Category    Type    변수명
IDC_EDIT_NAME    Conrol    CEdit    m_strName
IDC_EDIT_TEL    Conrol    CEdit    m_strTel

CDlgInsert 클래스에서 학인(IDOK) 버튼의 BN_CLIKED 이벤트 핸들러에 다음과

'Windows > MFC' 카테고리의 다른 글

대문자료 변환 MakeUpper  (0) 2013.10.02
UpdateData  (0) 2013.10.02
Wheel scrolling  (0) 2013.10.02
ImageView 이미지  (0) 2013.10.02
OnNcCreate 삼각,둥근 윈도우  (0) 2013.10.02