1. Connect .
    1. SQLAllocHandle( SQL_HANDLE_DBC, ... ) 함수 호출후 아래 함수 호출
    2. SQLSetConnectAttr( m_hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 );

  2. Commit
    1. SQL실행후 SQLCloseCursor 호출전에 아래 함수 호출.
    2. 아래 Rollback과 같이 호출하면 안됨.
    3. SQLEndTran(SQL_HANDLE_DBC, m_hdbc, SQL_COMMIT);

  3. Rollback
    1. SQL실행후 SQLCloseCursor 호출전에 아래 함수 호출.
    2. 위 Commit과 같이 호출하면 안됨.
    3. SQLEndTran(SQL_HANDLE_DBC, m_hdbc, SQL_ROLLBACK);

=========fileDSN.dsn
[ODBC]
DRIVER=SQL Server
UID=testid
DATABASE=testDb
PWD=passwd
APP=Microsoft Data Access Components
SERVER=testserver
=========

// 소스
#pragma comment(lib, "odbc32.lib")
#include <iostream>
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>

using namespace std;


void DsnQuery()
{
    //////////////////////////////////////////////////////////////////////////////////////
    // start
    SQLHENV hEnv;
    // 환경 핸들을 할당하고 버전 속성을 설정한다.
    if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv ) != SQL_SUCCESS )
        return;

    if( SQLSetEnvAttr( hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER ) != SQL_SUCCESS )
        return;

    // 연결 핸들을 할당하고 연결한다.
    SQLHDBC hDbc;
    if( SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hDbc ) != SQL_SUCCESS )
        return;

    SQLCHAR connectInfo[256] = { 0, };
    wsprintf( (char *)connectInfo,  "FILEDSN=.\\fileDSN.dsn" );
    SQLCHAR outInfo[256] = { 0, };
    SQLSMALLINT sqlRet = 0;
    SQLRETURN ret = SQLDriverConnect( hDbc, NULL, connectInfo, sizeof( connectInfo ), outInfo, sizeof( outInfo ),
        &sqlRet, SQL_DRIVER_NOPROMPT );

    if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) {
        cout << "ERROR : INI Table을 가져올수 없습니다.\n";
        return ;          
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // 명령 핸들 할당. 및 바인딩.
    // 명령 핸들을 할당한다.
    SQLHSTMT hStmt;
    SQLAllocHandle( SQL_HANDLE_STMT, hDbc, & hStmt );

    // 결과를 돌려 받기 위해 바인딩한다.
    SQLCHAR iniTablename[64];
    SQLLEN lIniTablename;
    SQLBindCol( hStmt, 1, SQL_C_CHAR, iniTablename, sizeof(iniTablename), &lIniTablename );

    // SQL문을 실행한다.
    SQLExecDirect( hStmt, (SQLCHAR *)"select name from test_table where name like 'test%' order by name", SQL_NTS );
    while( SQLFetch( hStmt ) != SQL_NO_DATA ) {
        cout << reinterpret_cast<char *>( iniTablename )  << endl;
    }

    SQLCloseCursor( hStmt );
    SQLFreeHandle( SQL_HANDLE_STMT, hStmt );

    //////////////////////////////////////////////////////////////////////////////////////
    // clean up
    SQLDisconnect( hDbc );
    SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
    SQLFreeHandle( SQL_HANDLE_ENV, hEnv );
}

int _tmain(int argc, _TCHAR* argv[])
{
    DsnQuery();
    return 0;
}




+ Recent posts