www.pudn.com > ADO_connect_query.rar > 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(); 
}