最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库、读数据表、执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢。
ADOOperate.H
ADOOperate.C
CoInitialize(NULL); // 初始化COM库
try
{
m_pConn.CreateInstance(__uuidof(Connection)); // 连接指针
m_pConn->ConnectionString = (_bstr_t)strSQL;
m_pConn->Open("","","",NULL);
}
catch (_com_error) // 连接出错处理
{
MessageBox(0,strDBType + "连接数据库错误","提示",MB_OK|MB_ICONINFORMATION);
return false;
}
catch (...)
{
AfxMessageBox("SYS Error");
return false;
}
return true;
}
//*********************************************
//
// 函数功能: 读取数据库表
// 参数: CString 字符串
// 返回值: 返回记录集数
// 作者: 孙高朝 2010.03.24
//
//*********************************************
_RecordsetPtr& CADOOperate::ReadTable(LPCSTR strSQL1,LPCSTR strDBType)
{
CString strSQL;
CString strSQL2;
CFileLog myFile;
strSQL2 = strSQL1;
strSQL = "SELECT * FROM " + strTableName ;
if(strSQL2.GetLength() > 0)
{
strSQL = "SELECT * FROM " + strTableName + " WHERE " + strSQL1;
}
try
{
if(m_pConn==NULL) // 判断连接是否断开
OpenDataBase(strDBType); // 重新连接
m_pRst.CreateInstance(__uuidof(Recordset)); // 数据集指针
m_pRst->raw_Close(); // 关闭记录集
m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
myFile.WriteToLog(ErrorFileName,"CADOOperate ReadTable()",(LPCSTR)e.Description());
}
return m_pRst; // 返回记录集
}
//*********************************************
//
// 函数功能: ADO释放函数
// 参数:
// 返回值:
// 作者: 孙高朝 2010.03.29
//
//*********************************************
void CADOOperate::ExitADO()
{
if(m_pRst->State)
{
m_pRst->Close();
}
m_pRst = NULL;
if (m_pConn->State)
{
m_pConn->Close();
}
m_pConn = NULL;
// 错误说明:智能指针_RecordsetPtr和_ConnectionPtr在超出作用域是会自动释放的,
// 也就是说指针在CreateInstance()的时候分配内存,在作用域外释放,
// 所以自己调用Release()并不是必需的,不过调用有可能出错,而设为NULL是完全可以不用的。
// m_pConn->Release();
CoUninitialize(); // 卸载COM库
}
//*********************************************
//
// 函数功能: 执行数据库操作
// 参数: LPCSTR 字符串指针
// 返回值: 返回记录集数
// 作者: 孙高朝 2010.03.29
//
//*********************************************
BOOL CADOOperate::ExecuteSQL(CString strSQL,LPCSTR strDBType)
{
try
{
if(m_pConn==NULL) // 判断连接是否断开
OpenDataBase(strDBType); // 重新连接
m_pRst.CreateInstance(__uuidof(Recordset)); // 数据集指针
m_pRst->raw_Close(); // 关闭记录集
m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
e.Description();
return FALSE;
}
return TRUE; // 返回记录集
}
//*********************************************
//
// 函数功能: 检查数据库是否存在该表
// 参数: LPCSTR 字符串指针
// 返回值: 返回TRUE OR FALSE
// 作者: 孙高朝 2010.03.29
//
//*********************************************
BOOL CADOOperate::funCheckTable(CString strName,CString strDBType)
{
CString strSQL;
// 选择数据库连接语句
if (strDBType == ACCESS) // ACCESS
{
strSQL = "SELECT * FROM MSysObjects WHERE Name = '" + strName + "'"; // 表名强制为大写, 判断是否存在
}
else if (strDBType == SQLSERVER) // SQL SERVER
{
strSQL = " " ;
}
else if (strDBType == ORACLE) // ORACLE
{
strSQL = "SELECT Table_Name FROM Tabs WHERE Table_Name='" + strName + "'"; // 表名强制为大写, 判断是否存在
}
try
{
if(m_pConn==NULL) // 判断连接是否断开
OpenDataBase(ORACLE); // 重新连接
m_pRst.CreateInstance(__uuidof(Recordset)); // 数据集指针
m_pRst->raw_Close(); // 关闭记录集
m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
e.Description();
return FALSE;
}
// 存在表否
if (m_pRst->adoEOF)
{
return FALSE;
}
return TRUE;
}