[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 이벤트 핸들러에 다음과
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 |