📄 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 + -