65,211
社区成员
发帖
与我相关
我的任务
分享
int MiMSSqlODBCConnect(const char *pInstName, const char *pUser,
const char *pPWD, SQLHENV &henv, SQLHDBC &hdbc)
{
SQLRETURN hRecode;
char szConnOption[1024];
SQLCHAR szConnStrOut[1024];
SQLSMALLINT cbConnStrOut = 0;
int nRet = WAVETOP_BACKUP_OK;
/* Allocate environment handle */
hRecode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (hRecode != SQL_SUCCESS && hRecode != SQL_SUCCESS_WITH_INFO) {
SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
"MiMSSqlConnect: SQLAllocHandle failed");
nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
goto CLEANUP;
}
/* Set the ODBC version environment attribute */
hRecode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if (hRecode != SQL_SUCCESS &&
hRecode != SQL_SUCCESS_WITH_INFO) {
SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
"MiMSSqlConnect: SQLSetEnvAttr failed");
nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
goto CLEANUP;
}
/* Allocate connection handle */
hRecode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (hRecode != SQL_SUCCESS && hRecode != SQL_SUCCESS_WITH_INFO) {
SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
"MiMSSqlConnect: SQLAllocHandle failed");
nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
goto CLEANUP;
}
/* Set login timeout to 3 seconds. */
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)3, 0);
/* connect string */
if (stricmp(pInstName, "MSSQLServer") == 0) {
_snprintf(szConnOption, sizeof(szConnOption), "DRIVER={SQL Server};"
"server=%s;uid=%s;pwd=%s",
g_MiGlobalConf.szHostIP, pUser, pPWD);
}
else {
_snprintf(szConnOption, sizeof(szConnOption), "DRIVER={SQL Server};"
"server=%s\\%s;uid=%s;pwd=%s",
g_MiGlobalConf.szHostIP, pInstName, pUser, pPWD);
}
/* Connect to data source */
hRecode = SQLDriverConnect(hdbc,
NULL,
(unsigned char *)szConnOption,
SQL_NTS,
szConnStrOut,
sizeof(szConnStrOut),
&cbConnStrOut,
SQL_DRIVER_NOPROMPT);
if (hRecode != SQL_SUCCESS && hRecode != SQL_SUCCESS_WITH_INFO) {
SLogErrorWrite(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, NULL,
"MiMSSqlConnect: SQLDriverConnect failed");
nRet = WAVETOP_BACKUP_INVALID_SYNTAX;
goto CLEANUP;
}
return nRet;
CLEANUP:
MiMSSqlODBCClear(henv, hdbc);
return nRet;
}
void MiMSSqlODBCClear(SQLHENV &henv, SQLHDBC &hdbc)
{
if (hdbc != SQL_NULL_HDBC) {
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
hdbc = SQL_NULL_HDBC;
}
if (henv != SQL_NULL_HENV) {
SQLFreeHandle(SQL_HANDLE_ENV, henv);
henv = SQL_NULL_HENV;
}
}