=========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;
}




_mbsbtype : 해당 글자가 Single byte인지 멀티바이트 시작문자인지 멀티바이트 끝문자인지 알아낸다.

사용예제
 
#include <mbctype.h>
#include <mbstring.h>

int main(int argc, char* argv[])
{
    const unsigned char    str[] = "hello 헬로우 월드";
  _setmbcp( 949 ); // 한글 윈도우에서는 codepage를 설정할 필요가 없다.
    for( int i = 0 ; i < sizeof( str ) ; ++i ) {

        switch( _mbsbtype( str , i ) ) {
        case _MBC_SINGLE:     // 싱글 바이트
            printf( "1 : [%c]\n", str[i] );
            break;
        case _MBC_LEAD:        // 멀티 바이트 헤더
            printf( "2 : [%c", str[i] );
            break;
        case _MBC_TRAIL:        // 멀티 바이트 테일
            printf( "%c]\n", str[i] );
            break;
        case _MBC_ILLEGAL:     // 알수 없는 문자.
            break;
        default:
            break;
        }
    }
   
    return 0;
}


출력결과
1 : [h]
1 : [e]
1 : [l]
1 : [l]
1 : [o]
1 : [ ]
2 : [헬]
2 : [로]
2 : [우]
1 : [ ]
2 : [월]
2 : [드]


http://www.leechen.net/bbs/zboard.php?id=0_lecture&no=421

http://www.winapi.co.kr


+ Recent posts