이번 데이터베이스시스템 특강 과제인 TPC-H (Transaction Processing Performace Council) Benchmark를 위해 내가 맡은 부분은 MSSQL이었다.
- KAIROS (MMDBMS)
- Oracle 11g (RDBMS)
- MySQL (RDBMS)
등의 다른 DBMS도 있었지만, 같은 팀의 어떤 분이 Benchmark 코드를 먼저 해놓으셔서 MSSQL에 ODBC로 연결하여 테스트 해보는 것이다.
이 과정에서 ODBC 연결이 나름 (?) 문제가 있어서 여기 저기 찾아보다가 딱 맞는 답이 없어서 여기에다가 정리해 보았다.
* 환경
- 운영체제: Windows Server Enterprise 2008 SP1
- CPU: Intel(R) Core(TM)2 Duo CPU E6750 2.66GHz
- RAM: 2GB
1. Microsoft VIsual Studio Team System 2008 설치
2. Micorsoft SQL Server 2008 설치
3. 이 둘을 연결하기 위한 ODBC 설정
- 시작 → 제어판 → 관리도구 → 데이터 원본 (ODBC) → 추가 → 맨 아래의 SQL Server 선택 → 이름: 사용할 이름, 설명, 연결 서버: 서버 이름이나 IP 주소 입력 → 인증 방법 선택 (필요할 경우 ID와 암호 입력) → 설정을 변경하거나 Default 사용 → 설정을 변경하거나 Default 사용 → 테스트가 완료되는지 확인
* 이 과정에서 로컬 PC에 SQL Server 2008이 설치된 것이 아니라 네트워크를 통해 접근을 하려면 다음과 같은 과정이 필요하다. (네트워크로 연결된 MSSQL Server 2008이 설치된 PC에서의 설정)
- 시작 → 모든 프로그램 → Microsoft SQL Server 2008 → 구성 도구 → SQL Server 구성 관리자 → SQL Server 네트워크 구성 → MSSQLSERVER에 대한 프로토콜 → 공유 메모리와 TCP/IP의 사용을 "예"로 설정
4. C++ Win32 Console 프로그램을 통한 연결 확인
예제 소스 다운로드
MSSQLConn.zip |
// MSSQLConn.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
#include "stdafx.h"
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
SQLHENV hEnv = SQL_NULL_HENV;
SQLHDBC hDbc = SQL_NULL_HDBC;
SQLHSTMT hStmt = SQL_NULL_HSTMT;
#define szDSN "serverName"
#define szUID "userID"
#define szPasswd "password"
#define MAXBUFLEN 255
void ProcessLogMessages(HENV plm_henv, HDBC plm_hdbc, HSTMT plm_hstmt, char *logstring);
BOOL MSSQLConnect();
void MSSQLDisConnect();
int _tmain(int argc, _TCHAR* argv[])
{
MSSQLConnect();
MSSQLDisConnect();
return 0;
}
BOOL MSSQLConnect()
{
// 연결 설정을 위한 변수들
SQLRETURN Ret;
// 환경 핸들을 할당하고 버전 속성을 설정
if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv) != SQL_SUCCESS) {
ProcessLogMessages(hEnv, hDbc, hStmt, "MSSQLConnect() Failed!!\n\n");
return FALSE;
}
if (SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER) != SQL_SUCCESS) {
ProcessLogMessages(hEnv, hDbc, hStmt, "MSSQLConnect() Failed!!\n\n");
return FALSE;
}
// 연결 핸들을 할당하고 연결
if (SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc) != SQL_SUCCESS) {
ProcessLogMessages(hEnv, hDbc, hStmt, "MSSQLConnect() Failed!!\n\n");
return FALSE;
}
Ret = SQLConnect(hDbc,(SQLCHAR *)szDSN,SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)szPasswd,SQL_NTS);
if ((Ret != SQL_SUCCESS) && (Ret != SQL_SUCCESS_WITH_INFO)) {
ProcessLogMessages(hEnv, hDbc, hStmt, "MSSQLConnect() Failed!!\n\n");
return FALSE;
}
// 명령 핸들을 할당
if (SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt) != SQL_SUCCESS) {
ProcessLogMessages(hEnv, hDbc, hStmt, "MSSQLConnect() Failed!!\n\n");
return FALSE;
}
ProcessLogMessages(hEnv, hDbc, hStmt, "MSSQLConnect() Successed!!\n");
return TRUE;
}
void MSSQLDisConnect()
{
if (hStmt) SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
if (hDbc) SQLDisconnect(hDbc);
if (hDbc) SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
if (hEnv) SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
printf("\nSQLDisconnect() Successed!!\n");
}
void ProcessLogMessages(HENV plm_henv, HDBC plm_hdbc, HSTMT plm_hstmt, char *logstring)
{
RETCODE plm_retcode = SQL_SUCCESS;
UCHAR plm_szSqlState[MAXBUFLEN] = "";
UCHAR plm_szErrorMsg[MAXBUFLEN] = "";
SDWORD plm_pfNativeError = 0L;
SWORD plm_pcbErrorMsg = 0;
printf(logstring);
while (plm_retcode != SQL_NO_DATA_FOUND) {
plm_retcode = SQLError(plm_henv, plm_hdbc, plm_hstmt, plm_szSqlState, &plm_pfNativeError, plm_szErrorMsg, MAXBUFLEN - 1, &plm_pcbErrorMsg);
if (plm_retcode != SQL_NO_DATA_FOUND){
printf("szSqlState = %s\n", plm_szSqlState);
printf("pfNativeError = %d\n", plm_pfNativeError);
printf("szErrorMsg = %s\n", plm_szErrorMsg);
printf("pcbErrorMsg = %d\n", plm_pcbErrorMsg);
}
}
}
* 여기서도 중요한 것은 Visual Studio 에서의 설정이다. Char에 대한 인코딩 문제가 있어서 프로젝트 속성 → 일반 속성 → 일반 → 프로젝트 기본값 → 문자 집합의 속성을 멀티바이트 속성을 사용으로 설정해줘야 함
'Extra Interest' 카테고리의 다른 글
| MSSQL Server 2008 ODBC Connection Sample (C++) (0) | 2008/12/12 |
|---|---|
| JBoss, Spring, Drools (0) | 2008/07/25 |
| Spring Framework & JBoss ESB, jBPM (0) | 2008/05/29 |
| JBoss Enterprise SOA Platform, Portals (0) | 2008/04/13 |
| JBoss Application Platform - Clustering (0) | 2008/03/26 |
| [임형준]20080304 JBoss Application Platform (0) | 2008/03/12 |
MSSQLConn.zip
[임형준]20080724 JBoss, Spring, Drools.pdf
[임형준]20080527 JBoss ESB & jBPM.pptx
[임형준]20080408 JBoss Enterprise SOA Platform, Portals.ppt