티스토리 뷰

Database/General

OLE DB 기본 사용법

엘키 2008. 8. 8. 14:13

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();

댓글