Connection 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Error 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Command 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Parameter 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Recordset 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Field 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Property 객체 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
'DB'에 해당되는 글 3건
- 2008.09.06 [ADO] ADO 객체 정리
- 2008.09.06 [ADO] INSERT, UPDATE, DELETE 기능
- 2008.09.06 [ADO] MFC ADO 사용법
ADO를 이용한 삽입, 삭제, 업뎃
void CTestADODlg::OnButton3()
{
// DAO (Access2000) 이후 버젼 리딩가능
AfxGetModuleState()->m_dwVersion = 0x0601;
// COM이나 OLE를 라이브러리를 초기화한다.
AfxOleInit();
// ADO에 Connection 객체 사용
_ConnectionPtr pConn;
HRESULT hr;
BOOL IsConnectionOpen = FALSE;
// DB를 열기 위한 예의상 구문으로 인식하고 넘어가자.
CoInitialize(NULL);
hr = pConn.CreateInstance(__uuidof(Connection));
//pConn->CursorLocation =adUseClient;
// 데이터베이스 접속
if(SUCCEEDED(hr))
{
// Provider: 여기서는 mdb를 사용하므로, Microsoft.Jet.OLEDB.4.0를 선택한다.
// Data위치: c:\\TestDb.mdb
_bstr_t strMode("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= d:\\dbTest.mdb;");
try
{
hr = pConn->Open(strMode,_bstr_t(L""),_bstr_t(L""), -1);
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
AfxMessageBox(e.ErrorMessage());
}
}
if(SUCCEEDED(hr))
{
AfxMessageBox("데이터베이스 연결됨");
IsConnectionOpen = TRUE;
}
// 데이터베이스에 연결이 되었다면,
if(IsConnectionOpen)
{
_RecordsetPtr pRs;
hr = pRs.CreateInstance(__uuidof(Recordset));
_bstr_t strQuery("Select * from tblTest");
// INSERT 구문
try
{
// 테이블명(tbltest)에서 필드ID에 200, Checker에 300을 삽입한다.
_bstr_t bstrQuery("INSERT INTO tbltest(ID,Checker) values('200','300')");
// 0L에서 0은 int형 0L은 long형을 의미한다.
// long형이 int 보다 더 큰수 저장가능
_variant_t valValue(0L);
// 새로운 트랜젝션을 시작한다.
pConn->BeginTrans();
pRs = pConn->Execute((_bstr_t)bstrQuery, &valValue, adOptionUnspecified);
// 현재 트랜젝션에서 일어난 변경을 저장하고 트랜젝션을 닫고
// 새로운 트랜젝션을 시작한다.
pConn->CommitTrans();
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
AfxMessageBox(e.ErrorMessage());
}
// UPDATE 구문
try
{
// 필드명 ID의 값이 2인 모든 곳의 필드명 ID, Checker의 필드값을 변경
_bstr_t bstrQuery2("UPDATE tbltest SET ID = 2000 , Checker = 300 WHERE ID = 2 ");
_variant_t valValue2(0L);
pConn->BeginTrans();
pConn->Execute((_bstr_t)bstrQuery2, &valValue2, adOptionUnspecified);
pConn->CommitTrans();
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
AfxMessageBox(e.ErrorMessage());
}
// DELETE 구문
try
{
// ID가 200인 tbltest 테이블 내의 Record를 삭제.
_bstr_t bstrQuery3("DELETE FROM tbltest WHERE ID = 200 ");
_variant_t valValue3(0L);
pConn->BeginTrans();
pConn->Execute((_bstr_t)bstrQuery3, &valValue3, adOptionUnspecified);
pConn->CommitTrans();
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
AfxMessageBox(e.ErrorMessage());
}
}
}
MS Access로 mdb를 만들었다고 가정하고 시작해본다.
ADO를 사용하기 위해서는 가령 작업하고 있는 파일(TestADODlg.cpp/TestADODlg.h),
라면 다음과 같은 선언을 상단에 우선적으로 해야한다.
(Step1) - 헤더파일
#if !defined(AFX_TESTADODLG_H__4B76919F_E8B6_4E36_92B4_4F549B5272FC__INCLUDED_)
#define AFX_TESTADODLG_H__4B76919F_E8B6_4E36_92B4_4F549B5272FC__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile")
using namespace ADODB;
// #import "C:\Program Files\Common Files\System\ADO\msado15.dll"no_namespace
// rename("EOF", "EndOfFile")
(Step2)
void CTestADODlg::OnTestADO()
{
// DAO (Access2000) 이후 버젼 리딩가능
AfxGetModuleState()->m_dwVersion = 0x0601;
// COM이나 OLE를 라이브러리를 초기화한다.
AfxOleInit();
// ADO에 Connection 객체 사용
_ConnectionPtr pConn;
HRESULT hr;
BOOL IsConnectionOpen = FALSE;
// DB를 열기 위한 예의상 구문으로 인식하고 넘어가자.
CoInitialize(NULL);
hr = pConn.CreateInstance(__uuidof(Connection));
pConn->CursorLocation = adUseClient;
// 데이터베이스 접속
if(SUCCEEDED(hr))
{
// Provider: 여기서는 mdb를 사용하므로, Microsoft.Jet.OLEDB.4.0를 선택한다.
// Data위치: D:\\tDbTest.mdb
_bstr_t strMode("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= d:\\dbTest.mdb;");
try
{
hr = pConn->Open(strMode,_bstr_t(L""),_bstr_t(L""), -1);
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
AfxMessageBox(e.ErrorMessage());
}
}
if(SUCCEEDED(hr))
{
AfxMessageBox("데이터베이스 연결됨");
IsConnectionOpen = TRUE;
}
// 데이터베이스에 연결이 되었다면, 레코드의 내용을 확인하자.
if(IsConnectionOpen)
{
_RecordsetPtr pRs;
hr = pRs.CreateInstance(__uuidof(Recordset));
_bstr_t strQuery("Select * from tblTest");
// 레코드셋 설정
hr = pRs->Open(strQuery, pConn.GetInterfacePtr(),
adOpenForwardOnly,adLockReadOnly,adCmdText);
// 아래와 같은 방식으로 접속해도 된다
// pRs = pConn->Execute((_bstr_t)strQuery, NULL, adOptionUnspecified);
_variant_t vtColumn;
_variant_t vtNull;
// _varint_t 형의 Type을 변경한다.
vtNull.ChangeType(VT_NULL);
TCHAR strDisp[MAX_PATH+1];
short i;
// Record수를 읽는다.
long nRecord = pRs->RecordCount;
// Field수를 구한다. 주의해야할 것은 long형이라는 것이다.
long nRow = pRs->Fields->Count;
// 다음은 Field수를 구하는 다른 방법이다.
long nRow2 = pRs->GetFields()->Count;
// 필드명 표시
for(i = 0; i<nRow ; i++)
{
// 필드명 취득
vtColumn = pRs->Fields->GetItem(i)->Name;
vtColumn.ChangeType(VT_BSTR);
// 문자열 복사하는 방법
lstrcpyn(strDisp,(_bstr_t)vtColumn,MAX_PATH);
}
// 필드값 표시
while(!pRs->EndOfFile)
{
for(i=0;i<nRow;i++)
{
// 필드값을 읽어온다
vtColumn = pRs->GetCollect(i);
// 또한 필드값을 읽어오는 다른 방법이다.
// vtColumn = pRs->Fields->GetItem(i)->Value;
// 조금더 다르게 하여 특정 필드의 필드값을 읽어온다.
// vtColumn = pRs->Fields->GetItem("Checker")->Value;
// 데이터가 NULL이면 ""을 대입
if(vtColumn == vtNull)
{
vtColumn = _variant_t("");
}
else
{
vtColumn.ChangeType(VT_BSTR);
}
lstrcpyn(strDisp,(_bstr_t)vtColumn,MAX_PATH);
}
pRs->MoveNext();
}
hr = pRs->Close();
}
pConn->Close();
}