MSVC – C & SQL Server 연동 with ODBC

By | 2024년 6월 4일
Table of Contents

MSVC – C & SQL Server 연동 with ODBC

#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>

#pragma comment(lib, "odbc32.lib")

#define MYSQLSUCCESS(rc) (((rc) == SQL_SUCCESS) || ((rc) == SQL_SUCCESS_WITH_INFO))

int main() {
    SQLHENV henv;
    SQLHDBC hdbc;

    SQLRETURN ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

    ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

    wchar_t  ws[2048]; // overflow 대응할 것
    swprintf(ws, 2048, L"DRIVER={SQL Server};SERVER=%hs;DATABASE=%hs;UID=%hs;PWD=%hs;", "127.0.0.1", "mydb", "myid", "mypwd");
    SQLWCHAR* connectionString = (SQLWCHAR*) ws;

    ret = SQLDriverConnectW(hdbc, NULL, connectionString, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
    if (MYSQLSUCCESS(ret) != true) {
        printf("ERROR : mssql connect failed.\n");
        return -1;
    }

    SQLHSTMT hstmt;
    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    SQLWCHAR sql[] = L"SELECT deviceidx, deviceUniqId, deviceName FROM [mydb].[dbo].[mytbl]";
    ret = SQLExecDirectW(hstmt, sql, SQL_NTS);
    if (MYSQLSUCCESS(ret) != true) {
        printf("ERROR : query failed.\n");
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return -1;
    }

    SQLINTEGER deviceidx;
    SQLWCHAR deviceUniqId[50];
    SQLWCHAR deviceName[50];

    for (ret = SQLFetch(hstmt); ret == SQL_SUCCESS; ret = SQLFetch(hstmt)) { 
        SQLGetData(hstmt, 1, SQL_C_LONG, &deviceidx, sizeof(deviceidx), NULL);
        SQLGetData(hstmt, 2, SQL_WCHAR, deviceUniqId, 50, NULL);  
        SQLGetData(hstmt, 3, SQL_WCHAR, deviceName, sizeof(deviceName), NULL);  
        wprintf(L"%i\n", deviceidx);
        wprintf(L"%s\n", deviceUniqId);
        wprintf(L"%s\n", deviceName);
    }

    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

답글 남기기