OLE DB 기본 사용법
CString strQuery;
CString strOut;
/////////////////////////////////////////////////////////////////////////////////////////////
// Command : CTable
// Accessor : CAccessor
// Rowset : CRowset
// 예제목적 : CTable 클래스를 이용해서 한 테이블의 모든 데이터를 읽어오는 방법.
class CUserInfoTable
{
public:
int m_nID;
char m_szName[20];
char m_szTel[20];
BEGIN_COLUMN_MAP(CUserInfoTable)
COLUMN_ENTRY(1, m_nID)
COLUMN_ENTRY(2, m_szName)
COLUMN_ENTRY(3, m_szTel)
END_COLUMN_MAP()
};
CTable<CAccessor<CUserInfoTable>, CRowset> AllContents;
AllContents.Open(m_OleDB.GetSession(), "UserInfo");
while(AllContents.MoveNext() == S_OK)
{
strOut.Format("ID=%d, Name=%s, Tel=%s", AllContents.m_nID, AllContents.m_szName, AllContents.m_szTel);
m_List.AddString(strOut);
}
AllContents.Close();
===========================================================================================================
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CNoAccessor(데이터를 받기위한 처리를 할 필요가 없다.)
// Rowset : CNoRowset(데이터를 받기 위한 버퍼작업을 할 필요가 없다.)
// 예제목적 : 반환값이 필요없는 쿼리를 실행시킬 경우의 가장 단순한 형태를 보여줌.
// 부연설명 : 반환값 없는 퀴리를 실행할 경우. 일반적으로 어떤 Accessor를 사용하더라도
// Open()함수에서 bBind값을 false로 설정하면 INSERT 명령어나 UPDATE명령어를
// 사용하는데 이상이 없을 것이다.
CCommand<CNoAccessor, CNoRowset, CNoMultipleResults> Cmd;
//strQuery = "INSERT INTO UserInfo (Name, Tel, FirstDate) VALUES ('이상팔', '000-0000-0000', GetDate())";
strQuery = "UPDATE UserInfo SET Tel = '111-111-1111' WHERE id = 1";
Cmd.Open(*(m_OleDB.GetSession()), strQuery, NULL, NULL, DBGUID_DBSQL, false);
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CAccessor
// Rowset : CRowset
// 예제목적 : CAccessor를 이용하여 사용자정의 레코드셑인 CUserInfoTable로 반환값을 받는 방법.
class CUserInfoTable
{
public:
int m_nID;
char m_szName[20];
char m_szTel[20];
BEGIN_COLUMN_MAP(CUserInfoTable)
COLUMN_ENTRY(1, m_nID)
COLUMN_ENTRY(2, m_szName)
COLUMN_ENTRY(3, m_szTel)
END_COLUMN_MAP()
};
CCommand<CAccessor<CUserInfoTable>, CRowset, CNoMultipleResults> Cmd;
Cmd.Open(m_OleDB.GetSession(), "select * from UserInfo", NULL, NULL, DBGUID_DEFAULT, true);
while(Cmd.MoveNext() == S_OK)
{
strOut.Format("ID=%d, Name=%s, Tel=%s", Cmd.m_nID, Cmd.m_szName, Cmd.m_szTel);
m_List.AddString(strOut);
}
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CAccessor
// Rowset : CArrayRowset
// 예제목적 : CAccessor를 이용해 배열의 형태로 사용자정의 레코드셑을 사용하는 방법.
class CUserInfoTable
{
public:
int m_nID;
char m_szName[20];
char m_szTel[20];
BEGIN_COLUMN_MAP(CUserInfoTable)
COLUMN_ENTRY(1, m_nID)
COLUMN_ENTRY(2, m_szName)
COLUMN_ENTRY(3, m_szTel)
END_COLUMN_MAP()
};
CCommand<CAccessor<CUserInfoTable>, CArrayRowset<CUserInfoTable>, CNoMultipleResults> Cmd;
strQuery = "select * from UserInfo";
Cmd.Open(m_OleDB.GetSession(), strQuery, NULL, NULL, DBGUID_DBSQL, true);
for(int i = 0; i < 3; i++) // i 의 값은 반환된 Rowset의 갯수임.
{ // 배열형으로 사용될 경우 제로베이스로 시작한다는 것에 주의.
strOut.Format("ID = %d, Name = %s, Tel = %s", Cmd[i].m_nID, Cmd[i].m_szName, Cmd[i].m_szTel);
m_List.AddString(strOut);
}
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CAccessor
// Rowset : CBulkRowset
// 예제목적 : 일반적으로 CRowset의 경우 한번에 하나의 Rowset을 읽어 오고 GetNextResult()가
// 호출될때 새로운 Rowset을 읽어오는 방법이지만, CBulkRowset 을 이용할 경우에는
// 한번에 읽어올 Rowset의 갯수를 지정할 수 있으며 그 사용방법을 보여준다.
class CTestOne
{
public:
int m_nID;
int m_naaaa;
int m_nbbbb;
int m_ncccc;
int m_ndddd;
BEGIN_COLUMN_MAP(CTestOne)
COLUMN_ENTRY(1, m_nID)
COLUMN_ENTRY(2, m_naaaa)
COLUMN_ENTRY(3, m_nbbbb)
COLUMN_ENTRY(4, m_ncccc)
COLUMN_ENTRY(5, m_ndddd)
END_COLUMN_MAP()
CCommand<CAccessor<CTestOne>, CBulkRowset, CNoMultipleResults> Cmd;
strQuery = "select * from Test1";
Cmd.SetRows(20); // 기본적으로는 한번에 10개씩 읽어오는 것으로 설정돼 있음.
Cmd.Open(m_OleDB.GetSession(), strQuery, NULL, NULL, DBGUID_DBSQL, true);
Cmd.MoveToRatio(20, 40);
while(Cmd.MoveNext() == S_OK)
{
strOut.Format("ID = %d, aaaa = %d, bbbb = %d, cccc = %d, dddd = %d",
Cmd.m_nID, Cmd.m_naaaa, Cmd.m_nbbbb, Cmd.m_ncccc, Cmd.m_ndddd);
m_List.AddString(strOut);
}
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// CDynamicAccessor를 사용하는 방법
// oledb.h 에 DBTYPE에 대한 정보가 있습니다.
// 반환되는 각 레코드의 형과 갯수를 알고 있을 경우.
CCommand<CDynamicAccessor, CRowset, CNoMultipleResults> Cmd;
strQuery = "select * from UserInfo";
Cmd.Open(m_OleDB.GetSession(), strQuery, NULL, NULL, DBGUID_DBSQL, true);
int nID = 0;
TCHAR szName[20];
TCHAR szTel[21];
while(Cmd.MoveNext() == S_OK)
{
nID = *(int*)(Cmd.GetValue(1));
::sprintf(szName, (TCHAR*)Cmd.GetValue(2));
::sprintf(szTel, (TCHAR*)Cmd.GetValue(3));
strOut.Format("ID = %d, Name = %s, Tel = %s", nID, szName, szTel);
m_List.AddString(strOut);
}
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CAccessor
// Rowset : CRowset
// 예제목적 : 스토어프로시져가 하나의 입력파라미터를 가지며, 반환값을 가지고 있을때 사용하는 방법.
// 실질적으로 중요한 부분은 CParamInput 유저레코드셑 임.
// 목적: 입력파라미터와 반환값을 얻는데 사용되는 형태.
class CParamInput
{
public:
int m_nParamInput; // 입력파라미터값으로 사용되는 변수.
TCHAR m_szName[20]; // 반환값으로 사용되는 변수.
TCHAR m_szTel[20]; // 반환값으로 사용되는 변수.
BEGIN_COLUMN_MAP(CParamInput) // 각각의 레코드(컬럼)의 값을 연결합니다.
COLUMN_ENTRY(1, m_szName) // 방법론적인것으로 이런 형태라고 이해하면됨.
COLUMN_ENTRY(2, m_szTel)
END_COLUMN_MAP()
BEGIN_PARAM_MAP(CParamInput) // 파라미터의 값을 설정.
SET_PARAM_TYPE(DBPARAMIO_INPUT) // 입력파라미터의 형태임.
COLUMN_ENTRY(1, m_nParamInput) // 첫번재 파라미터에 연결할 변수.
END_PARAM_MAP()
};
/*++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE PROCEDURE sp_ParamInput
@num int
AS
select [Name], Tel from UserInfo where ID=@num
GO
****************************************************/
CCommand<CAccessor<CParamInput>, CRowset, CNoMultipleResults> Cmd;
strQuery = "sp_ParamInput ?"; // storeprocedure 호출방법.
// 두개의 입력파라미터가 존재한다면 ? -> ?, ?로 바뀜.
Cmd.m_nParamInput = 2; // 입력파라미터에 값 설정.
HRESULT hr = Cmd.Open(m_OleDB.GetSession(), strQuery, NULL, NULL, DBGUID_DBSQL, true);
while(Cmd.MoveNext() == S_OK)
{
strOut.Format("Name = %s, Tel = %s", Cmd.m_szName, Cmd.m_szTel);
m_List.AddString(strOut);
}
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command: CCommand
// Accessor : CAccessor
// Rowset : CRowset
// 예제목적 : 스토어프로시져가 하나의 출력파라미터를 가지며, 반환값이 없을때 사용되는 경우.
// 입력파라미터만 있는 경우도 이 예제와 유사함.
// 실질적으로 중요한 부분은 CParamOut 유저레코드셑임.
// 목적 : 출력파라미터를 얻는데 사용되는 형태.
// 입력파라미터의 경우도 동일한 형태임.
class CParamOut
{
public:
int m_nParamOut; // 출력파라미터를 얻느데 사용되는 변수.
BEGIN_PARAM_MAP(CParamOut) // 파라미터의 값을 연결.
SET_PARAM_TYPE(DBPARAMIO_OUTPUT)// 출력파라미터의 형태임.
COLUMN_ENTRY(1, m_nParamOut) // 첫번째 파라미터에 연결할 변수.
END_PARAM_MAP()
};
/*********************************
CREATE PROCEDURE sp_ParamOut
@Ret int OUTPUT
AS
BEGIN
SET @Ret = 99
END
**********************************/
CCommand<CAccessor<CParamOut>, CRowset, CNoMultipleResults> Cmd;
strQuery = "sp_ParamOut ? OUT"; // 출력파라미터를 설정할 경우 반드시 ?뒤에 OUT을 붙여야 함.
Cmd.Open(*(m_OleDB.GetSession()), strQuery, NULL, NULL, DBGUID_DBSQL, true);
strOut.Format("Out Parameter = %d", Cmd.m_nParamOut);
m_List.AddString(strOut);
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CAccessor
// Rowset : CRowset
// 예제목적 : 스토어프로시져가 입력파라미터와 출력파라미터를 가지고 반환값이 없을 경우.
// 실질적으로 중요한 부분은 CParamInputOutput 유저레코드셑임.
// 목적 : 입력파라미터와 출력파라미터가 있는 경우 사용되는 형태.
class CParamInputOutput
{
public:
int m_nParamInput;
int m_nParamOutput;
BEGIN_PARAM_MAP(CParamInputOutput) // 파라미터의 값을 연결.
SET_PARAM_TYPE(DBPARAMIO_INPUT) // 입력파라미터의 형태임.
COLUMN_ENTRY(1, m_nParamInput) // 첫번째 파라미터에 연결할 변수.
SET_PARAM_TYPE(DBPARAMIO_OUTPUT)// 출력파라미터의 형태임.
COLUMN_ENTRY(2, m_nParamOutput) // 두번째 파라미터에 연결할 변수.
END_PARAM_MAP()
};
/****************************************
CREATE PROCEDURE sp_ParamInputOutput
@num int, 입력값을 읽어서 버리는 구조.
@Ret int OUTPUT
AS
BEGIN
Set @Ret = @num
END
*****************************************/
CCommand<CAccessor<CParamInputOutput>, CRowset, CNoMultipleResults> Cmd;
strQuery = "sp_ParamInputOutput ?, ? OUT"; // 프로시져에 입출력 파라미터가 있다고 알림.
Cmd.m_nParamInput = 22; // 입력파라미터의 값을 22로 설정.
Cmd.Open(m_OleDB.GetSession(), strQuery, NULL, NULL, DBGUID_DBSQL, true);
// 반환값이 없을 경우, MoveNext()나 GetNextResult()를 호출할 필요가 없음.
strOut.Format("Input Param = %d, Output Param = %d", Cmd.m_nParamInput, Cmd.m_nParamOutput);
m_List.AddString(strOut);
Cmd.Close();
============================================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command : CCommand
// Accessor : CAccessor
// Rowset : CRowset
// 예제목적 : 스토어프로시져가 입출력 파라미터를 가지며, 반환값이 있을 경우.
// 이 예제는 특히 CMultipleResults클래스가 사용되었다는 점에 유의.
// 출력파라미터는 반환값을 모두 받은 후에 GetNextResult()를 호출한 다음에
// 얻을 수 있음.
// 목적 : 입출력 파라미터가 있고 반환값이 있는 경우 사용되는 형태.
class CResultParamIO
{
public:
int m_nParamInput; // 입력파라미터를 위한 변수.
int m_nParamOutput; // 출력파라미터를 위한 변수.
// 여기부터는 각가의 레코드에 사용되는 변수임.
int m_nID;
TCHAR m_szName[20];
TCHAR m_szTel[20];
BEGIN_PARAM_MAP(CResultParamIO)
SET_PARAM_TYPE(DBPARAMIO_INPUT)
COLUMN_ENTRY(1, m_nParamInput)
SET_PARAM_TYPE(DBPARAMIO_OUTPUT)
COLUMN_ENTRY(2, m_nParamOutput)
END_PARAM_MAP()
BEGIN_COLUMN_MAP(CResultParamIO)
COLUMN_ENTRY(1, m_nID)
COLUMN_ENTRY(2, m_szName)
COLUMN_ENTRY(3, m_szTel)
END_COLUMN_MAP()
/*************************************************
CREATE PROCEDURE sp_ResultParamIO
@num int,
@Ret int OUTPUT
AS
BEGIN
select * from UserInfo where ID = @num
Set @Ret = 99
END
*************************************************/
CCommand<CAccessor<CResultParamIO>, CRowset, CMultipleResults> Cmd;
strQuery = "sp_ResultParamIO ?,? OUT";
Cmd.m_nParamInput = 2; // 입력파라미터의 값을 2로 설정.
Cmd.Open(m_OleDB.GetSession(), strQuery, NULL, NULL, DBGUID_DBSQL, true);
// 반환값을 읽어온다.
while(Cmd.MoveNext() == S_OK)
{
strOut.Format("ID = %d, Name = %s, Tel = %s, ParamInput = %d",
Cmd.m_nID,
Cmd.m_szName,
Cmd.m_szTel,
Cmd.m_nParamInput);
m_List.AddString(strOut);
}
// 출력파라미터를 얻기 위해 호출한다.
Cmd.GetNextResult(NULL, true);
int nResultOut = Cmd.m_nParamOutput; // 출력파라미터의 값을 얻는다.
strOut.Format("Out Param = %d", nResultOut);
m_List.AddString(strOut);
Cmd.Close();