📄 getdatabase.cpp
字号:
// DatabaseAccess.cpp: implementation of the CDatabaseAccess class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GetDataBase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDatabaseAccess::CDatabaseAccess()
{
CoInitialize(NULL);
m_bIsOracle=true; //默认是使用ORACLE数据库
try
{
m_pCon.CreateInstance(_uuidof(Connection));
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::CDatabaseAccess()-- 创建COM实例失败%s,%s\n",(char *)e.Description(),(char *)e.ErrorMessage());
return;
}
catch (...) {
TRACE("--CDatabaseAccess::CDatabaseAccess()-- 未知错误,创建COM实例失败\n");
return;
}
}
CDatabaseAccess::~CDatabaseAccess()
{
CloseConnect();
}
// 关闭与数据库的连接
void CDatabaseAccess::CloseConnect()
{
try
{
if(m_pCon ->State)
m_pCon ->Close();
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::CloseConnect()-- %s,%s\n",(char *)e.Description(),(char *)e.ErrorMessage());
return;
}
catch (...) {
TRACE("--CDatabaseAccess::CloseConnect()-- 不明错误\n");
return;
}
}
// 设置数据库类型
void CDatabaseAccess::SetDatabaseType(bool bIsOracle/*=true*/)
{
m_bIsOracle=bIsOracle;
}
//连接到数据库服务器,采用系统DSN方式 1成功 0失败
BOOL CDatabaseAccess::ConnectDB(char *pcDSNName,char *pcUserName,char *pcUserPassword)
{
//连接Sql Server数据库
if (!m_bIsOracle)
{
try
{
CString strConnection; //连接字符串
strConnection.Format("DSN=%s;UID=%s;PWD=%s" ,pcDSNName ,
pcUserName ,pcUserPassword);
HRESULT hResult=m_pCon->Open(strConnection.GetBuffer(0) ,"" ,"" ,adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return 1; //连接成功!
else
return 0; //连接失败!
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());
return 0; //连接失败
}
catch (...) {
TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");
return 0;
}
}
return 0;
}
// 连接到数据库服务器,需要IP,端口和Oracle全局数据库名或SID的连接方式。1成功 0失败.
BOOL CDatabaseAccess::ConnectDB(const char *pcUserName ,const char *pcUserPassword ,const char *pcServerIP ,const char *pcServerPort ,const char *pcGlobalDatabaseName/* = "MFD"*/)
{
if(!m_bIsOracle)
{
try
{
CString strConnection; //连接字符串
strConnection.Format("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s" ,
pcUserPassword,pcUserName,pcGlobalDatabaseName,pcServerIP);
TRACE("%s\n" , strConnection.GetBuffer(0));
HRESULT hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return 1; //连接成功!
else
return 0; //连接失败!
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());
return 0; //连接失败
}
catch (...) {
TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");
return 0;
}
}
else
{
try
{
CString strConnection; //连接字符串
strConnection.Format("Provider=MSDAORA.1;Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %s)))(CONNECT_DATA =(SERVICE_NAME = %s)));User ID=%s;Password=%s" ,
pcServerIP ,pcServerPort ,pcGlobalDatabaseName ,pcUserName , pcUserPassword);
TRACE("%s\n" , strConnection.GetBuffer(0));
HRESULT hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return 1; //连接成功!
else
return 0; //连接失败!
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());
return 0; //连接失败
}
catch (...) {
TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");
return 0;
}
}
}
// 执行存储过程(普通存储过程,即非包中的),非零-正确执行;0-失败(参数个数为负数)。
BOOL CDatabaseAccess::ExecuteProcedure(const char *pcProcedureName , PARAMETERINFO aParameterInfo[] , BYTE bCount)
{
_CommandPtr pCmd;
HRESULT hRet = pCmd.CreateInstance(_uuidof(Command));
if(FAILED(hRet))
{
TRACE("--CDatabaseAccess::ExecuteProcedure()-- 创建COMMAND对象失败!");
return 0;
}
_ParameterPtr *aParameterPtr = NULL;
if(bCount > 0)
{
// 动态创建参数对象
aParameterPtr = new _ParameterPtr[bCount];
memset(aParameterPtr , 0 ,sizeof(_ParameterPtr) * bCount);
}
try
{
_bstr_t bstrSPName(pcProcedureName); // 存储过程名
if(bCount<=0) // 无参数
{
if(bCount<0)
{
return 0; // 出错
}
pCmd->ActiveConnection = m_pCon; // 设置COMMAND对象的属性
pCmd->CommandText = bstrSPName;
pCmd->CommandType = adCmdStoredProc;
// 动态创建记录集对象。
_RecordsetPtr *ppRs = new _RecordsetPtr();
(*ppRs) = pCmd->Execute(NULL ,NULL ,NULL); // 执行存储过程.
return (BOOL)ppRs;
}
pCmd->ActiveConnection = m_pCon; // 设置COMMAND对象的属性
pCmd->CommandText = bstrSPName;
pCmd->CommandType = adCmdStoredProc;
//创建参数实例并添加之
for(int i=0; i < bCount; i++)
{
aParameterPtr[i] = pCmd->CreateParameter(aParameterInfo[i].Name , aParameterInfo[i].Type , aParameterInfo[i].Direction , aParameterInfo[i].Size);
pCmd->Parameters->Append(aParameterPtr[i]);
}
if(!m_bIsOracle) // SQLServer中需要!
pCmd->Parameters->Refresh(); // 资源集中的操作
// 对输入参数的处理
for(i=0; i < bCount; i++)
{
if(aParameterInfo[i].Direction==adParamInput || aParameterInfo[i].Direction == adParamInputOutput)
{
if(m_bIsOracle) //oracle数据库
{
pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value = aParameterInfo[i].Value;
}
else //SQLserver数据库
{
CString str;
str.Format("@%s",((char *)aParameterInfo[i].Name));
pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value = aParameterInfo[i].Value;
}
}
}
pCmd->Execute(NULL ,NULL ,NULL); //通过COMMAND对象来执行存储过程。
// 对输出参数的处理
for(i=0; i < bCount; i++)
{
if(aParameterInfo[i].Direction==adParamOutput || aParameterInfo[i].Direction == adParamInputOutput)
{
if(m_bIsOracle) //oracle数据库
{
aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value;
}
else //SQLserver数据库
{
CString str;
str.Format("@%s",((char *)aParameterInfo[i].Name));
aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value;
}
}
}
if(bCount > 0)
delete []aParameterPtr;
return 1;
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ExecuteProcedure()-- %s,%s\n",(char *)e.Description(),(char *)e.ErrorMessage());
if(bCount > 0)
delete []aParameterPtr;
return 0;
}
catch (...) {
TRACE("--CDatabaseAccess::ExecuteProcedure()-- 不明错误\n");
if(bCount > 0)
delete []aParameterPtr;
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -