您的位置:首页 > 数据库 > Oracle

一个数据库操作类,适用于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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐