// AdoDB.cpp: implementation of the CAdoDB class.
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AdoDB.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CAdoDB g_adoDB;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAdoDB::CAdoDB():m_strSource(_T(""))
{
if (!SUCCEEDED(::CoInitialize(NULL)))
{
AfxMessageBox(_T(" COM Init error! "));
}
if (!CreateAdoInstance())
{
::OutputDebugString(_T("CAdoDB::CAdoDB(): Create Ado instance error!\n"));
}
}
CAdoDB::~CAdoDB()
{
ReleaseAdoInstance();
::CoUninitialize();
}
/*********************************************************\
FUNCTION: ConnectToDB();
作用:连接到数据库。
Para: 连接参数;
bCloseIfLive: 如果已经连接,是否关闭重连。
\*********************************************************/
BOOL CAdoDB::ConnectToDB(const DBPARA &Para,BOOL bCloseIfLive)
{
_bstr_t _Source("");
///////////////////////////////
if (m_pConnection!=NULL && m_pConnection->GetState())
{
if (bCloseIfLive) DisconnectDB();
else return TRUE;
}
m_pConnection->CommandTimeout=(Para.nTimeOut>0)?Para.nTimeOut:5;
/////////////////////////////////////////
switch(Para.nDriverType)
{
case driverODBC://ODBC DataSource(万能型)
_Source=_bstr_t("Data Source=")+Para._Database;
break;
case driverSQLServer://SQL Server
_Source=_bstr_t("Driver={SQL SERVER};");
_Source+=_bstr_t("Server=")+Para._Server;
_Source+=_bstr_t(";Database=")+Para._Database;
break;
case driverACCESS97://ACCESS 97
_Source=_bstr_t("Provider=Microsoft.Jet.OLEDB.3.51");
_Source+=_bstr_t(";Data Source=")+Para._Database;
break;
case driverACCESS2000://ACCESS 2000 OR XP
_Source=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0");
_Source+=_bstr_t(";Data Source=")+Para._Database;
_Source+=_bstr_t(";Jet OLEDB:DataBase Password=")+Para._Pwd;
break;
case driverACCESSXP:
_Source=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;");
_Source+=_bstr_t("Data Source=")+Para._Database;
_Source+=_bstr_t(";Jet OLEDB:DataBase Password=")+Para._Pwd;
break;
default:
return FALSE;
}
//////////////////////////////////////////////////
try
{
HRESULT hr;//
if ( Para.nDriverType>=driverACCESS97 )
hr = m_pConnection->Open(_Source,"","",adModeUnknown);
else
hr = m_pConnection->Open(_Source,Para._User,Para._Pwd,adModeUnknown);
if (SUCCEEDED(hr))
{
//Save datasource
m_strSource = (const char*) _Source;
}
}
catch(_com_error &e)
{
::OutputDebugString(_T("CAdoDB::ConnectToDB() Error:\n"));
::OutputDebugString(e.ErrorMessage());
}
return m_pConnection->GetState();
}
/************************************\
断开连接
\************************************/
void CAdoDB::DisconnectDB()
{
try
{
if (m_pConnection!=NULL)
{
if (m_pConnection->GetState())
m_pConnection->Close();
}
}
catch(_com_error &e)
{
::OutputDebugString(_T("CAdoDB::DisconnectDB() Error:\n"));
::OutputDebugString(e.ErrorMessage());
}
}
/**********************************************************************\
执行SQL脚本,无返回数据集(适用于Insert .../Update ... / Delete ...)
_strSqlScript: 要执行的SQL脚本;
pAffectedRecord:执行该脚本后受影响的记录数指针,可为空
\**********************************************************************/
BOOL CAdoDB::ExecuteSQLQuery(/*in*/_bstr_t _strSqlScript,/*in/out*/long* pAffectedRecord)
{
ASSERT(m_pConnection!=NULL);
if (!IsDBConnected()) return FALSE;
/////////////////////////////////
HRESULT hr;
try
{
if (!m_pConnection->GetState()) return FALSE;
_variant_t _varAffected;
VariantInit(&_varAffected);
hr = m_pConnection->Execute(_strSqlScript,&_varAffected,adCmdText);
if (pAffectedRecord) *pAffectedRecord = (long)_varAffected;
}
catch(_com_error &e)
{
::OutputDebugString(_T("\nCAdoDb::ExecuteSQLQuery() Error:\n"));
::OutputDebugString(e.ErrorMessage());
return FALSE;
}
return SUCCEEDED(hr);
}
/*********************************************************\
执行SQL脚本,返回数据集(适用于全部SQL语句....)
_strSqlScript: 要执行的SQL脚本;
_pRecordset : 返回来的记录集
pAffectedRecord:执行该脚本后受影响的记录数指针,可为空
\*********************************************************/
BOOL CAdoDB::ExecuteSQLQuery(_bstr_t _strSqlScript, CAdoRecordset &Recordset, long *pAffectedRecord)
{
ASSERT(m_pConnection!=NULL);
if ( !IsDBConnected() ) return FALSE;
/////////////////////////////////////
try
{
Recordset.Close();
_RecordsetPtr _pRecordset = Recordset.Detach();
if (_pRecordset==NULL)
{
if ( !Recordset.CreateInstance() ) return FALSE;
_pRecordset = Recordset.Detach();
}
_variant_t _varAffected;
VariantInit(&_varAffected);
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandText=_strSqlScript;
_pRecordset = m_pCommand->Execute(&_varAffected,NULL,adCmdText);
Recordset.Attach(_pRecordset);
if ( pAffectedRecord )
*pAffectedRecord = (long)_varAffected;
}
catch(_com_error &e)
{
::OutputDebugString(_T("\nCAdoDB::ExecuteSQLQuery(ALL Type) Error:"));
::OutputDebugString(e.ErrorMessage());
return FALSE;
}
return TRUE;
}
/*********************************************************************
** 函数名称: ExecStoreProc
** 函数功能: 执行存储过程
** 入口参数: pWorkOrderID, pMarkNumber -> 存储过程的输入参数
** 出口参数:
*********************************************************************/
void CAdoDB::ExecStoreProc(_bstr_t pWorkOrderID, _bstr_t pMarkNumber)
{
_CommandPtr pCommand;
pCommand.CreateInstance("ADODB.Command");
// 存储过程的输入参数
_ParameterPtr pPtrWorkOrder;
pPtrWorkOrder.CreateInstance("ADODB.Parameter");
pPtrWorkOrder->Name = _bstr_t("WorkOrder"); // 存储过程的参数
pPtrWorkOrder->Type = adVarChar; // 字符串类型
pPtrWorkOrder->Size = 64; // 参数长度
pPtrWorkOrder->Direction = adParamInput; // 输入参数
pPtrWorkOrder->Value=_variant_t(pWorkOrderID); // int->CString->_variant_t
_ParameterPtr pPtrMarkNumber;
pPtrMarkNumber.CreateInstance("ADODB.Parameter");
pPtrMarkNumber->Name = _bstr_t("MarkNumber"); // 存储过程的参数
pPtrMarkNumber->Type = adVarChar; // 字符串类型
pPtrMarkNumber->Size = 32; // 参数长度
pPtrMarkNumber->Direction = adParamInput; // 输入参数
pPtrMarkNumber->Value=_variant_t(pMarkNumber); // int->CString->_variant_t
pCommand->Parameters->Append(pPtrWorkOrder);
pCommand->Parameters->Append(pPtrMarkNumber);
pCommand->ActiveConnection = m_pConnection;
pCommand->CommandText="VIS_LD_Check_SNInfo"; // 存储过程的名字
pCommand->CommandType=adCmdStoredProc; // 表示为存储过程 adCmdStoredProc
// 执行; 获得结果
_RecordsetPtr pRecordset = pCommand->Execute(NULL, NULL, adCmdStoredProc);
/* === 从数据集中得到相应字段的值
_variant_t TheValue = pRecordset->GetCollect("Result");
strResult=(char*)_bstr_t(TheValue);
_variant_t TheMsg = abc->GetCollect("Msg");
strMsg=(char*)_bstr_t(TheMsg);
_variant_t TheTemplate = abc->GetCollect("Template");
strTemplate=(char*)_bstr_t(TheTemplate);
*/
pPtrWorkOrder->Release();
pPtrMarkNumber->Release();
pCommand->Release();
}
/*********************************************************\
执行SQL脚本,返回数据集(适用于查询:Select * from ....)
_strSqlScript: 要执行的SQL脚本;
_pRecordset : 返回来的记录集
\*********************************************************/
BOOL CAdoDB::OpenSQLQuery(/*in*/_bstr_t _strSqlScript, /*in,out*/CAdoRecordset &Recordset)
{
ASSERT(m_pConnection!=NULL);
if ( !IsDBConnected() ) return FALSE;
/////////////////////////////////
HRESULT hr;
try
{
Recordset.Close();
_RecordsetPtr _pRe