一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
2014-05-27 09:58
543 查看
最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库、读数据表、执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢。
ADOOperate.H
[cpp] view plaincopy
//////////////////////////////////////////////////////////////////////
// 类功能:用于数据库的操作 主要实现 连接数据库 读数据表 检查数据表 执行SQL语句
//
// 孙高朝 2010.03.25
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_)
#define AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "stdafx.h"
class CADOOperate
{
public:
CString m_DataSource; // 数据源
CString m_PassWord; // 密码
CString m_UserName; // 数据库名
_ConnectionPtr m_pConn; // ADO连接
CString strTableName; // 表名 外边传入
_RecordsetPtr m_pRst; // 记录集
public:
BOOL funCheckTable(CString strName,CString strDBType);
BOOL ExecuteSQL(CString strSQL,LPCSTR strDBType = ORACLE);
_RecordsetPtr& ReadTable(LPCSTR strSQL1 = NULL,LPCSTR strDBType = ORACLE); // 读表 返回记录集
BOOL OpenDataBase(CString lpDBType); // 连接数据库
void ExitADO();
CADOOperate();
virtual ~CADOOperate();
};
#endif // !defined(AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_)
ADOOperate.C
[cpp] view plaincopy
// ADOOperate.cpp: implementation of the CADOOperate class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ADOOperate.h"
#include "h_Const.h"
#include "ShareFun.h"
#include "FileLog.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CADOOperate::CADOOperate()
{
strTableName = " "; // 初始化表名
m_DataSource = " "; // 数据源
m_PassWord = " "; // 密码
m_UserName = " "; // 数据库名
}
CADOOperate::~CADOOperate()
{
}
//*********************************************
//
// 函数功能: 连接数据库
// 参数: CString 字符串
// 返回值: TRUE: 连接成功 FALSE:连接失败
// 作者: 孙高朝 2010.03.24
//
//*********************************************
BOOL CADOOperate::OpenDataBase(CString strDBType)
{
CString strSQL;
CShareFun myFun;
// 选择数据库连接语句
if (strDBType == ACCESS) // ACCESS
{
CString strPath;
strPath = myFun.funGetPath();
strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strPath + "MobileDB.mdb;Persist Security Info=False";
}
else if (strDBType == SQLSERVER) // SQL SERVER
{
strSQL = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BookManage" ;
}
else if (strDBType == ORACLE) // 默认为ORACLE
{
// 读取ADO.INI的文件
m_DataSource = myFun.funReadini(DATASOURCE);
m_UserName = myFun.funReadini(USERNAME);
m_PassWord = myFun.funReadini(PASSWORD);
strSQL = "Provider=MSDAORA.1;Password=" + (CString)m_PassWord + ";User ID=" + (CString)m_UserName
+ ";Data Source=" + (CString)m_DataSource + ";Persist Security Info=True"; // 数据库连接语句
}
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;
}
ADOOperate.H
[cpp] view plaincopy
//////////////////////////////////////////////////////////////////////
// 类功能:用于数据库的操作 主要实现 连接数据库 读数据表 检查数据表 执行SQL语句
//
// 孙高朝 2010.03.25
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_)
#define AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "stdafx.h"
class CADOOperate
{
public:
CString m_DataSource; // 数据源
CString m_PassWord; // 密码
CString m_UserName; // 数据库名
_ConnectionPtr m_pConn; // ADO连接
CString strTableName; // 表名 外边传入
_RecordsetPtr m_pRst; // 记录集
public:
BOOL funCheckTable(CString strName,CString strDBType);
BOOL ExecuteSQL(CString strSQL,LPCSTR strDBType = ORACLE);
_RecordsetPtr& ReadTable(LPCSTR strSQL1 = NULL,LPCSTR strDBType = ORACLE); // 读表 返回记录集
BOOL OpenDataBase(CString lpDBType); // 连接数据库
void ExitADO();
CADOOperate();
virtual ~CADOOperate();
};
#endif // !defined(AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_)
ADOOperate.C
[cpp] view plaincopy
// ADOOperate.cpp: implementation of the CADOOperate class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ADOOperate.h"
#include "h_Const.h"
#include "ShareFun.h"
#include "FileLog.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CADOOperate::CADOOperate()
{
strTableName = " "; // 初始化表名
m_DataSource = " "; // 数据源
m_PassWord = " "; // 密码
m_UserName = " "; // 数据库名
}
CADOOperate::~CADOOperate()
{
}
//*********************************************
//
// 函数功能: 连接数据库
// 参数: CString 字符串
// 返回值: TRUE: 连接成功 FALSE:连接失败
// 作者: 孙高朝 2010.03.24
//
//*********************************************
BOOL CADOOperate::OpenDataBase(CString strDBType)
{
CString strSQL;
CShareFun myFun;
// 选择数据库连接语句
if (strDBType == ACCESS) // ACCESS
{
CString strPath;
strPath = myFun.funGetPath();
strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strPath + "MobileDB.mdb;Persist Security Info=False";
}
else if (strDBType == SQLSERVER) // SQL SERVER
{
strSQL = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BookManage" ;
}
else if (strDBType == ORACLE) // 默认为ORACLE
{
// 读取ADO.INI的文件
m_DataSource = myFun.funReadini(DATASOURCE);
m_UserName = myFun.funReadini(USERNAME);
m_PassWord = myFun.funReadini(PASSWORD);
strSQL = "Provider=MSDAORA.1;Password=" + (CString)m_PassWord + ";User ID=" + (CString)m_UserName
+ ";Data Source=" + (CString)m_DataSource + ";Persist Security Info=True"; // 数据库连接语句
}
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;
}
相关文章推荐
- 一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
- 一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、Access、SQLITE
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)2
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(二)
- JSP中访问Oracle ,SqlServer ,DB2, Informix ,Access 数据库
- SqlServer,Access,Oracle连接数据库的方法
- 数据库Oracle与SqlServer与Access
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(四)
- ADO.NET 连接数据库字符串(Oracle、SqlServer、Access、ODBC)
- (转)c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)
- 【经典】c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)
- 在JSP中访问Oracle ,SqlServer ,DB2, Informix ,Access 数据库 (njwx)
- 正好整理了一下,自己做了个连接数据库的组件,支持SQLSERVER,ACCESS,ORACLE,FoxPro,MySql,IBM DB2,DBF等数据库,并且支持事务处理
- ADO.NET 连接数据库(Oracle、SqlServer、Access、ODBC)
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)
- 【经典】c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)
- 在JSP中访问Oracle ,SqlServer ,DB2, Informix ,Access 数据库
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(三)
- 在JSP中访问Oracle ,SqlServer ,DB2, Informix ,Access 数据库
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(一)