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