?? dbconnection.cpp
字號:
#include "stdafx.h"
#include "DBConnection.h"
extern char strServer[];//服務器
extern char strUID[];//用戶名
extern char strPWD[];//密碼
extern char strDBname[];//數據庫名
///////////////////////////////////////////////////////////////////////////////////////////////
//想法:
//ODBC的數據庫連接,可以只提供一個連接,所有需要訪問數據庫的操作互斥共用一個連接;
//也可以為每個需要訪問數據庫的操作建立數據庫聯接
//前者的好處是數據庫服務器負擔較輕,適合有很多用戶訪問數據庫的情況
//后者的好處是保證客戶端的高效
//現在程序采用后者,為每個需要訪問數據庫的操作建立數據庫聯接
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
//ODBC全局環境句柄獲取,釋放
//SQLRETURN ODBCDbInitialHenv()
//void ODBCDbFreeHenv()
///////////////////////////////////////////////////////////////////////////////////////////////
SQLHENV GlobalHenv;
//初始化,獲得全局的ODBC環境句柄GlobalHenv,并設置環境屬性
//是ODBCDbInitialHdbc()函數運行的基礎
//必須在程序開始時,操作數據庫前,調用本函數,初始化GlobalHenv,才能保證后面操作數據庫時,正確運行
//返回值SQL_SUCCESS或者SQL_SUCCESS_WITH_INFO被認為成功
//ODBCDbInitialHenv()函數如果不能返回成功,則不讓程序往下運行。可以提示重新輸入數據庫連接數據或提示退出
//在此假設下,不再專門保留全局變量保存ODBCDbInitialHenv()函數的返回值,來反映GlobalHenv的值是否有效
//能正常進入程序,則認為GlobalHenv的值為有效值。
SQLRETURN ODBCDbInitialHenv()
{
char ConnStr[128];
memset(ConnStr,0,128);
sprintf(ConnStr,"DRIVER={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s",strServer,strUID,strPWD,strDBname);
SQLRETURN retcode;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &GlobalHenv);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
//獲取GlobalHenv環境句柄成功,則設置環境屬性
//(void*)SQL_OV_ODBC3這種轉換有例程這么用
retcode = ::SQLSetEnvAttr(GlobalHenv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
return retcode;
}
else
{
return retcode;
}
}
//釋放ODBC全局環境句柄
//此函數應該與ODBCDbInitialHenv()函數的調用對應
//因此只在程序結束時調用一次
void ODBCDbFreeHenv()
{
SQLFreeHandle(SQL_HANDLE_ENV, GlobalHenv);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//ODBC連接句柄獲取,釋放
//SQLRETURN ODBCDbInitialHdbc(SQLHDBC* pHdbc)
//void ODBCDbFreeDb(SQLHDBC* pHdbc)
///////////////////////////////////////////////////////////////////////////////////////////////
//ODBCDbInitialHdbc()函數,通過全局的環境句柄GlobalHenv獲得連接句柄
//一個環境句柄可以對應多個連接句柄,
//GlobalHenv有效時,本函數可以多次調用,建立多個連接
SQLRETURN ODBCDbInitialHdbc(SQLHDBC* pHdbc)
{
char szBuffer[1024];
SWORD swStrLen;
SQLRETURN retcode;
//ConnStr,連接字符串
char ConnStr[128];
memset(ConnStr,0,128);
sprintf(ConnStr,"DRIVER={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=%s",strServer,strUID,strPWD,strDBname);
/* Allocate connection handle */
retcode = ::SQLAllocHandle(SQL_HANDLE_DBC, GlobalHenv, pHdbc);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
/* Set login timeout to 5 seconds. */
::SQLSetConnectAttr(*pHdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
retcode= SQLDriverConnect(*pHdbc,NULL,
(unsigned char*)ConnStr,
strlen(ConnStr),
(unsigned char*)szBuffer,
sizeof(szBuffer),
&swStrLen,
SQL_DRIVER_COMPLETE_REQUIRED);
}
return retcode;
}
void ODBCDbFreeDb(SQLHDBC* pHdbc)
{
SQLDisconnect(*pHdbc);
SQLFreeHandle(SQL_HANDLE_DBC, *pHdbc);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//ADO連接句柄獲取,釋放
//SQLRETURN ODBCDbInitialHdbc(SQLHDBC* pHdbc)
//void ODBCDbFreeDb(SQLHDBC* pHdbc)
///////////////////////////////////////////////////////////////////////////////////////////////
long ADODbInitialConnectionPtr(_ConnectionPtr* pADOConn)
{
long retADOConn=-1;
pADOConn->CreateInstance(__uuidof(Connection));
TCHAR AdoConnStr[128];
memset(AdoConnStr,0,128);
wsprintf (AdoConnStr, _T("PROVIDER=SQLOLEDB;SERVER=%s;DATABASE=%s;UID=%s;PWD=%s"),strServer,strDBname,strUID,strPWD);
_bstr_t bstrADOConn=AdoConnStr;
retADOConn=(*pADOConn)->Open(bstrADOConn,"","",-1);
return retADOConn;
}
void ADOFree(_ConnectionPtr* pADOConn)
{
(*pADOConn)->Release();
(*pADOConn)->Close();
pADOConn->Release();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -