📄 clsadooperater.cpp
字号:
// ClsAdoOperater.cpp : Implementation of CClsAdoOperater
#include "stdafx.h"
#include "OracleCom.h"
#include "ClsAdoOperater.h"
#include <comutil.h>
#include "../include/AbstractDBDriver.h"
#include "../include/OCIDBDriver.h"
#include "../include/IConnection.h"
/////////////////////////////////////////////////////////////////////////////
// CClsAdoOperater
db::AbstractDBDriver * g_DbDriver;
db::IConnection * g_pConn;
db::ICallableStatement * g_pStmt;
void SetParaContent(db::ParamStruct ¶,db::ParamType paraType,const std::string& strParavalue,
db::DataType datatype,const std::string& strDataname);
void GetProcResult(db::ICallableStatement * pStmt,
db::ParamStruct *pPara,int iParaCount);
void SetInputAndRegOuput(db::ICallableStatement * pStmt,
db::ParamStruct *pPara,int iParaCount);
STDMETHODIMP CClsAdoOperater::InitConnect(BSTR szDsnInfo, BOOL bFlag)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
g_DbDriver = new OCIDBDriver;
g_DbDriver->Init("oracle");
std::string strDsnInfo;
strDsnInfo = _com_util::ConvertBSTRToString(szDsnInfo);
std::string strDsn;
std::string strUser;
std::string strPwd;
int iPosFirst = 0;
int iPosEnd = 0;
iPosFirst = strDsnInfo.find("dsn=");
if(iPosFirst != std::string::npos)
{
iPosEnd = strDsnInfo.find(";",iPosFirst);
if(iPosEnd != std::string::npos)
strDsn = strDsnInfo.substr(iPosFirst + 4,iPosEnd - iPosFirst - 4);
else
return S_FALSE;
}
else
return S_FALSE;
iPosFirst = strDsnInfo.find("uid=");
if(iPosFirst != std::string::npos)
{
iPosEnd = strDsnInfo.find(";",iPosFirst);
if(iPosEnd != std::string::npos)
strUser = strDsnInfo.substr(iPosFirst + 4,iPosEnd - iPosFirst - 4);
else
return S_FALSE;
}
else
return S_FALSE;
iPosFirst = strDsnInfo.find("pwd=");
if(iPosFirst != std::string::npos)
{
iPosEnd = strDsnInfo.find(";",iPosFirst);
if(iPosEnd != std::string::npos)
strPwd = strDsnInfo.substr(iPosFirst + 4,iPosEnd - iPosFirst - 4);
else
return S_FALSE;
}
else
return S_FALSE;
// 1. get connection
try
{
g_pConn = g_DbDriver->GetConnection(strDsn,strUser,strPwd);
}
catch (const db::SqlException &e)
{
//创建数据库连接失败,置数据库状态为Off
//g_dbStatProbe.SetOff(m_strDSN);
::SysFreeString(szDsnInfo);
return S_FALSE;
}
::SysFreeString(szDsnInfo);
return S_OK;
}
STDMETHODIMP CClsAdoOperater::PKGetXX(BSTR szBhType, BSTR szTableId, BSTR szXh, BSTR szKeyWords, VARIANT *pszContent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
std::string m_strProcedureName = "PK_query.get_xx";
db::ParamStruct m_parameters[5];
int iParaCount = 5;
//报号类型
SetParaContent(m_parameters[0],db::PT_IN,
_com_util::ConvertBSTRToString(szBhType),db::DT_STRING,"");
//表名标识
SetParaContent(m_parameters[1],db::PT_IN,
_com_util::ConvertBSTRToString(szTableId),db::DT_STRING,"");
//序号
SetParaContent(m_parameters[2],db::PT_IN,
_com_util::ConvertBSTRToString(szXh),db::DT_STRING,"");
//关键词
SetParaContent(m_parameters[3],db::PT_IN,
_com_util::ConvertBSTRToString(szKeyWords),db::DT_STRING,"");
//信息发布(单条)
SetParaContent(m_parameters[4],db::PT_OUT,"",db::DT_STRING,"");
// 2. 产生执行存储过程的sql语句
std::string sql = g_DbDriver->GenStoredProcedureSql(m_strProcedureName,iParaCount);
// 3. 编译sql
try
{
g_pStmt = g_pConn->PrepareCall(sql);
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// //g_dbStatProbe.SetOff(m_strDSN);
//
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
// 4. 设置输入参数并注册输出参数
try
{
SetInputAndRegOuput(g_pStmt,m_parameters,iParaCount);
}
catch (const db::SqlException &e)
{
//置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
// 5. execute
try
{
g_pStmt->Execute();
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = e.GetDescription().c_str();
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
CComVariant ccvar;
// 6. 取输出参数
try
{
GetProcResult(g_pStmt,m_parameters,iParaCount);
ccvar = m_parameters[4].paramValue.c_str();
ccvar.Detach(pszContent);
ccvar.Clear();
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
return S_OK;
}
STDMETHODIMP CClsAdoOperater::PKGetGG(BSTR szBhType, BSTR szTableId, BSTR szXh, BSTR szKeyWords, VARIANT *pszContent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
std::string m_strProcedureName = "PK_query.get_gg";
db::ParamStruct m_parameters[5];
int iParaCount = 5;
//报号类型
SetParaContent(m_parameters[0],db::PT_IN,
_com_util::ConvertBSTRToString(szBhType),db::DT_STRING,"");
//表名标识
SetParaContent(m_parameters[1],db::PT_IN,
_com_util::ConvertBSTRToString(szTableId),db::DT_STRING,"");
//序号
SetParaContent(m_parameters[2],db::PT_IN,
_com_util::ConvertBSTRToString(szXh),db::DT_STRING,"");
//关键词
SetParaContent(m_parameters[3],db::PT_IN,
_com_util::ConvertBSTRToString(szKeyWords),db::DT_STRING,"");
//广告内容(单条)
SetParaContent(m_parameters[4],db::PT_OUT,"",db::DT_STRING,"");
// 2. 产生执行存储过程的sql语句
std::string sql = g_DbDriver->GenStoredProcedureSql(m_strProcedureName,iParaCount);
// 3. 编译sql
try
{
g_pStmt = g_pConn->PrepareCall(sql);
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// //g_dbStatProbe.SetOff(m_strDSN);
//
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
// 4. 设置输入参数并注册输出参数
try
{
SetInputAndRegOuput(g_pStmt,m_parameters,iParaCount);
}
catch (const db::SqlException &e)
{
//置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
// 5. execute
try
{
g_pStmt->Execute();
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
CComVariant ccvar;
// 6. 取输出参数
try
{
GetProcResult(g_pStmt,m_parameters,iParaCount);
ccvar = m_parameters[4].paramValue.c_str();
ccvar.Detach(pszContent);
ccvar.Clear();
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszContent);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
return S_OK;
}
STDMETHODIMP CClsAdoOperater::PKGetZJ(BSTR szBhType, BSTR szTableId, BSTR szXh, BSTR szKeyWords, VARIANT *pszName, VARIANT *pszPhone)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
std::string m_strProcedureName = "PK_query.get_zj";
db::ParamStruct m_parameters[6];
int iParaCount = 6;
//报号类型
SetParaContent(m_parameters[0],db::PT_IN,
_com_util::ConvertBSTRToString(szBhType),db::DT_STRING,"");
//表名标识
SetParaContent(m_parameters[1],db::PT_IN,
_com_util::ConvertBSTRToString(szTableId),db::DT_STRING,"");
//序号
SetParaContent(m_parameters[2],db::PT_IN,
_com_util::ConvertBSTRToString(szXh),db::DT_STRING,"");
//关键词
SetParaContent(m_parameters[3],db::PT_IN,
_com_util::ConvertBSTRToString(szKeyWords),db::DT_STRING,"");
//企业简称(单条)
SetParaContent(m_parameters[4],db::PT_OUT,"",db::DT_STRING,"");
//转接电话(单条)
SetParaContent(m_parameters[5],db::PT_OUT,"",db::DT_STRING,"");
// 2. 产生执行存储过程的sql语句
std::string sql = g_DbDriver->GenStoredProcedureSql(m_strProcedureName,iParaCount);
// 3. 编译sql
try
{
g_pStmt = g_pConn->PrepareCall(sql);
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// //g_dbStatProbe.SetOff(m_strDSN);
//
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszName);
ccvar.Clear();
ccvar = "";
ccvar.Detach(pszPhone);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
// 4. 设置输入参数并注册输出参数
try
{
SetInputAndRegOuput(g_pStmt,m_parameters,iParaCount);
}
catch (const db::SqlException &e)
{
//置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
CComVariant ccvar;
ccvar = "";
ccvar.Detach(pszName);
ccvar.Clear();
ccvar = "";
ccvar.Detach(pszPhone);
ccvar.Clear();
::SysFreeString(szBhType);
::SysFreeString(szTableId);
::SysFreeString(szXh);
::SysFreeString(szKeyWords);
return S_FALSE;
}
// 5. execute
try
{
g_pStmt->Execute();
}
catch (const db::SqlException &e)
{
// //置数据库状态为Off
// g_dbStatProbe.SetOff(m_strDSN);
//
//释放ICallableStatement
g_pStmt->Close();
//释放连接
g_pConn->Close();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -