#ifndef _ODBC_H
#define _ODBC_H
#include "windows.h"
#include "sql.h"
#include "sqlext.h"
#include <string>
using namespace std;
class CODBCConnect
{
SQLHANDLE m_hEnv;
SQLHANDLE m_hCon;
SQLHANDLE m_hStmt;
char szTmpField[65535];
int m_nCurField;
int m_nCurRow;
bool CreateStmtHandle();
public:
CODBCConnect();
~CODBCConnect();
bool Create();
bool Connect(const string &datasource,const
string &user="",const string
&pwd="");
bool Reset();
bool Execute(char *src);
long FetchMaxIdentity(char* tablename);
bool FetchNextRow();
char *FetchNextField();
long GetFieldNum();
};
#endif
#include "odbc.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
static SQLHANDLE g_hEnv=NULL;
SQLHANDLE GetEnvHandle()
{
if(g_hEnv!=NULL)
{
return g_hEnv;
}
SQLAllocHandle(SQL_HANDLE_ENV,NULL,&g_hEnv);
SQLSetEnvAttr(g_hEnv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
return g_hEnv;
}
CODBCConnect::CODBCConnect()
{
m_hEnv=NULL;
m_hCon=NULL;
m_hStmt=NULL;
m_nCurRow=m_nCurField=0;
}
CODBCConnect::~CODBCConnect()
{
if(m_hStmt!=NULL)
{
SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
}
if(m_hCon!=NULL)
{
SQLFreeHandle(SQL_HANDLE_DBC,m_hCon);
}
}
bool
CODBCConnect::Create()
{
if(m_hCon!=NULL)
CloseHandle(m_hCon);
m_hEnv = GetEnvHandle();
SQLRETURN ret;
ret=SQLAllocHandle(SQL_HANDLE_DBC,m_hEnv,&m_hCon);
if(ret==SQL_ERROR || ret==SQL_INVALID_HANDLE)
{
return false;
}
return true;
}
bool CODBCConnect::Connect(const
string &server,const string
&usr,const string &pwd)
{
if(m_hCon==NULL)
{
if(!Create())
return false;
}
SQLCHAR servername[64];
SQLCHAR user[64];
SQLCHAR password[64];
strcpy((char*)servername,server.c_str());
strcpy((char*)user,usr.c_str());
strcpy((char*)password,pwd.c_str());
SQLSMALLINT server_len = strlen((char*)servername);
SQLSMALLINT user_len = strlen((char*)user);
SQLSMALLINT pass_len = strlen((char*)password);
SQLRETURN ret =
SQLConnect(m_hCon,servername,server_len,user,user_len,password,pass_len);
if ((ret != SQL_SUCCESS) &&
(ret != SQL_SUCCESS_WITH_INFO))
{
return false;
}
else
{
return true;
}
return true;
}
bool
CODBCConnect::CreateStmtHandle()
{
if(m_hCon==NULL)
{
return false;
}
SQLRETURN
ret=SQLAllocHandle(SQL_HANDLE_STMT,m_hCon,&m_hStmt);
if(ret==SQL_ERROR || ret==SQL_INVALID_HANDLE)
{
return false;
}
return true;
}
long
CODBCConnect::FetchMaxIdentity(char*
tablename)
{
char sql[512];
sprintf(sql,"DBCC CHECKIDENT (%s,
NORESEED);",tablename);
if(!Execute(sql))
return 0;
if(FetchNextRow())
{
return atol(FetchNextField());
}
return 0;
}
bool CODBCConnect::Execute(char
*src)
{
if(m_hStmt!=NULL)
{
SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
m_hStmt=NULL;
CreateStmtHandle();
}
else
{
CreateStmtHandle();
}
SQLINTEGER len=strlen(src);
SQLRETURN ret=SQLExecDirect(m_hStmt,(SQLCHAR*)src,len);
SQLCHAR SqlState[6],
Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i, MsgLen;
SQLRETURN rc2;
bool brtn = false;
if(ret!=SQL_SUCCESS && ret!=
SQL_SUCCESS_WITH_INFO)
{
i = 1;
memset(Msg,0,sizeof(Msg));
while ((rc2 = SQLGetDiagRec(SQL_HANDLE_STMT,m_hStmt, i,
SqlState, &NativeError,
Msg, sizeof(Msg)-1,
&MsgLen)) != SQL_NO_DATA)
{
memset(Msg,0,sizeof(Msg));
i++;
}
brtn = false;
}
else
{
brtn = true;
}
return brtn;
}
bool
CODBCConnect::FetchNextRow()
{
SQLRETURN ret;
m_nCurField=0;
ret=SQLFetch(m_hStmt);
if(ret!=SQL_SUCCESS &&
ret!= SQL_SUCCESS_WITH_INFO)
{
return false;
}
else
{
return true;
}
}
bool CODBCConnect::Reset()
{
if(m_hStmt!=NULL)
{
SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
m_hStmt=NULL;
}
return true;
}
long GetFieldNum()
{
short nField;
ret=SQLNumResultCols(m_hStmt,&num_field);
return nField;
}
char
*CODBCConnect::FetchNextField()
{
szTmpField[0]='\0';
if(m_nCurField>=GetFieldNum())
return szTmpField;
int i=m_nCurField;
m_nCurField++;
long len=0;
SQLRETURN
ret=SQLGetData(m_hStmt,i+1,SQL_C_CHAR,szTmpField,sizeof(szTmpField)-1,&len);
szTmpField[len]='\0';
if(ret!=SQL_SUCCESS && ret!=
SQL_SUCCESS_WITH_INFO)
{
}
return szTmpField;
}