vc++ ado访问类 CAdoAcc.h
来源:互联网 发布:债券承销 知乎 编辑:程序博客网 时间:2024/05/24 07:43
/******************************************************************
模块名称:数据库操作类;
实现功能:实现数据查询、插入、删除等操作,提供对sqlserver和oracle的联接方式。
研究人员:姜广新
最后更新:2017-11-15
预先操作:
【1】在stdafx.h中添加
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
【2】在主进程的InitInstance()中添加
if(!AfxOleInit())
{
AfxMessageBox("OLE初始化错误");
return FALSE;
}
【3】在.cpp文件中要包含"AdoAcc.h"
*********************************************************************/
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ADOACC_H__45108404_3E89_4952_85C6_16954F5CA80E__INCLUDED_)
#define AFX_ADOACC_H__45108404_3E89_4952_85C6_16954F5CA80E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CAdoAcc
{
public:
CAdoAcc();
CAdoAcc(_ConnectionPtr pConnection);
virtual ~CAdoAcc();
public:
//连接数据库
BOOL Connect(CString strUser,CString strPassword,CString strFileName="ConnectionParam.udl",int nOptions=-1,CString strConStr="Provider=sqloledb.1;Data Source=(local);Database=VLan");
BOOL ConnectSqlserver(CString Server,CString db,CString User,CString Password);
BOOL ConnectOracle(CString Datasource,CString Userid,CString Password);
//关闭数据库的连接
void DisConnect();
//数据库查询语句,用来对数据库的各种字段进行查询
//如果成功返回TRUE,否则返回FALSE.查询的结果存储在类的共有成员变量m_pRecordset中
//查询结果的行数和列数分别保存在共有成员变量m_nResultRow和m_nResultCol中
CString GetValues(CString columnName);
CString GetValues(int col);
int GetInt(CString columnName);
BOOL Select(CString strSql);
//查询语句,负责对仅仅查询一个字段的情况进行处理
//结果存放在CStringArray类型的变量pResult中
BOOL Select(CString strSql,CStringArray& Result);
//对多个字段进行查询
BOOL SelectMulitCol(CString strSql,CStringArray& Result);
//打开表
BOOL OpenTable(CString strTable);
BOOL Open(CString sql);
//打开表
BOOL OpenTable(CString strTable,CStringArray& Result);
//进行其它的更新操作
BOOL Execute(CString strSql);
public:
void CloseCommand();
BOOL AdoEOF();
void MoveNext();
BOOL ExecuteTrans(CStringArray& aSql);
//关闭结果集合
void CloseRecordset();
//得到操作结果的列数
long GetResultCol();
//得到操作结果的条数
long GetResultRow();
//得到操作结果
_RecordsetPtr GetResult();
//连接指针
_ConnectionPtr m_pConnection;
private:
//数据库操作返回的结果条数
long m_nResultRow;
//返回的_RecordsetPtr中列数
long m_nResultCol;
//命令执行指针
_CommandPtr m_pCommand;
//结果集指针
_RecordsetPtr m_pRecordset;
};
#endif // !defined(AFX_ADOACC_H__45108404_3E89_4952_85C6_16954F5CA80E__INCLUDED_)
// AdoAcc.cpp: implementation of the CAdoAcc class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AdoAcc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAdoAcc::CAdoAcc()
{
//初始化
m_nResultRow = 0;
m_nResultCol=0;
m_pConnection = NULL;
//创建对象
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pCommand.CreateInstance(_uuidof(Command));
}
//传入参数的构造函数
CAdoAcc::CAdoAcc(_ConnectionPtr pConnection)
{
m_pConnection = pConnection;
m_nResultRow = 0;
m_nResultCol=0;
//创建对象
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pCommand.CreateInstance(_uuidof(Command));
}
//////////////////////////////////////////////////////////////////////
// 析构函数
//////////////////////////////////////////////////////////////////////
CAdoAcc::~CAdoAcc()
{
}
/////////////////////////////////////////////////////////////////////
///简单操作函数
////////////////////////////////////////////////////////////////////
//得到操作结果的行数
long CAdoAcc::GetResultRow()
{
return this->m_nResultRow;
}
//得到操作结果的列数
long CAdoAcc::GetResultCol()
{
return this->m_nResultCol;
}
//得到操作结果
_RecordsetPtr CAdoAcc::GetResult()
{
return this->m_pRecordset;
}
///////////////////////////////////////////////////////////////////////
///连接操作
///////////////////////////////////////////////////////////////////////
//连接到数据库
//1.连接字符串可以自己构造,也可以从文件中读出
BOOL CAdoAcc::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
{
try{
m_pConnection.CreateInstance(__uuidof(Connection));
HRESULT hr;
//如果用文件方式配置数据源,进行配置
if(strFileName.Compare("")!=0)
{
CString con = "File Name="+strFileName;
m_pConnection->ConnectionString =(_bstr_t)con;
hr=m_pConnection->Open("","","",nOptions);
}
else
{
//自己配置连接字符串
m_pConnection->ConnectionString = (_bstr_t)strConStr;
hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions);
}
//进行连接
//连接失败
if(FAILED(hr))
{
AfxMessageBox("连接失败!");
return FALSE;
}
}
catch(_com_error&e)
{
AfxMessageBox(e.Description()+"B");
return FALSE;
}
return TRUE;
}
/*
_bstr_t strConnect="Provider=SQLOLEDB; Server=server_name;"
"Database=database_name; uid=user_name; pwd=password;";
//connecting to the database server now:
try{pMyConnect->Open(strConnect,"","",NULL);}
*/
BOOL CAdoAcc::ConnectSqlserver(CString Server,CString db,CString User,CString Password)
{
CString s;
s.Format("Provider=SQLOLEDB;Data Source=%s;Database=%s",Server,db);
try{
m_pConnection.CreateInstance(__uuidof(Connection));
HRESULT hr;
//自己配置连接字符串
m_pConnection->ConnectionString = _bstr_t(s);
hr=m_pConnection->Open("",_bstr_t(User),_bstr_t(Password),-1);
//进行连接
//连接失败
if(FAILED(hr))
{
AfxMessageBox("连接失败!");
return FALSE;
}
}
catch(_com_error&e)
{
AfxMessageBox(s);
AfxMessageBox(e.Description()+"B");
return FALSE;
}
return TRUE;
}
//conn->Open("Provider=OraOLEDB.Oracle.1;DataSource=yourDB;User ID=yourID;Password=yourPASSWORD","","",adModeUnknown);
BOOL CAdoAcc::ConnectOracle(CString Datasource,CString Userid,CString Password)
{
CString s;
s.Format("Provider=OraOLEDB.Oracle.1;Data Source=%s;User ID=%s;Password=%s",Datasource,Userid,Password);
try{
m_pConnection.CreateInstance(__uuidof(Connection));
HRESULT hr;
//自己配置连接字符串
//m_pConnection->ConnectionString = _bstr_t(s);
hr=m_pConnection->Open(_bstr_t(s),"","",adModeUnknown);
//进行连接
//连接失败
if(FAILED(hr))
{
AfxMessageBox("连接失败!");
return FALSE;
}
}
catch(_com_error&e)
{
AfxMessageBox(s);
AfxMessageBox(e.Description()+"B");
return FALSE;
}
return TRUE;
}
//断开连接
void CAdoAcc::DisConnect()
{
if(m_pRecordset->State!=adStateClosed)
m_pRecordset->Close();
m_pRecordset = NULL;
if(m_pCommand->State!=adStateClosed)
m_pCommand->Release();
m_pCommand = NULL;
if(m_pConnection->State!=adStateClosed)
m_pConnection->Close();
m_pConnection = NULL;
}
///////////////////////////////////////////////////////////////////////
///更新操作
///////////////////////////////////////////////////////////////////////
BOOL CAdoAcc::Execute(CString strSql)
{
try
{
_variant_t vNULL;
vNULL.vt = VT_ERROR;
///定义为无参数
vNULL.scode = DISP_E_PARAMNOTFOUND;
///非常关键的一句,将建立的连接赋值给它
m_pCommand->ActiveConnection = m_pConnection;
///命令字串
m_pCommand->CommandText = (_bstr_t)strSql;
///执行命令,取得记录集
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
//确实,vNULL中的intVal是执行操作所影响的行数
m_nResultRow = 0;
m_nResultRow = vNULL.intVal;
}
catch(_com_error &e)
{
m_nResultRow = 0;
return FALSE;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////
///查询操作
///////////////////////////////////////////////////////////////////////
BOOL CAdoAcc::Select(CString strSql)
{
try
{
m_nResultCol=0;
m_nResultRow=0;
m_pRecordset->CursorLocation=adUseClient; //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
m_pRecordset->Open(_variant_t(strSql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
m_nResultRow = m_pRecordset->GetRecordCount(); //得到查询结果的行数
}
catch(_com_error&e)
{
AfxMessageBox(e.Description()+"D");
return FALSE;
}
return TRUE;
}
//查询语句,负责对仅仅查询一个字段的情况进行处理
//结果存放在CStringArray类型的变量pResult中
BOOL CAdoAcc::Select(CString strSql,CStringArray& Result)
{
if(Select(strSql)!=0)
{
Result.RemoveAll();
for(int i=0;i<m_nResultRow;i++)
{
_variant_t value;
value=m_pRecordset->Fields->Item[(long)0]->Value;
if(value.vt==3||value.vt==14)
{
CString strTrans;
strTrans.Format("%ld",value.intVal);
Result.Add(strTrans);
}
else
Result.Add(value.bstrVal);//
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
return TRUE;
}
else
{
m_pRecordset->Close();
return FALSE;
}
}
BOOL CAdoAcc::SelectMulitCol(CString strSql,CStringArray& Result)
{
if(Select(strSql)!=0)
{
Result.RemoveAll();
_variant_t value;
for(int i=0;i<m_nResultRow;i++)
{
for(int j=0;j<m_nResultCol;j++)
{
value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
if(value.vt==3||value.vt==14)
{
CString strTrans;
strTrans.Format("%ld",value.intVal);
Result.Add(strTrans);
}
else
if(value.vt==7)
{
COleDateTime time = value.date;
CString strTemp;
strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
Result.Add(strTemp);
}
else
Result.Add(value.bstrVal);//
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
return TRUE;
}
else
{
m_pRecordset->Close();
return FALSE;
}
}
//打开整张表
BOOL CAdoAcc::OpenTable(CString strTable)
{
try
{
m_nResultCol=0;
m_nResultRow=0;
m_pRecordset->CursorLocation=adUseClient; //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
m_pRecordset->Open(_variant_t(strTable),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable);
m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
m_nResultRow = m_pRecordset->GetRecordCount(); //得到查询结果的行数
}
catch(_com_error&e)
{
AfxMessageBox(e.Description()+"E");
return FALSE;
}
return TRUE;
}
BOOL CAdoAcc::Open(CString sql)
{
if(m_pRecordset->State != adStateClosed)
m_pRecordset->Close();
try
{
m_nResultCol=0;
m_nResultRow=0;
m_pRecordset->CursorLocation=adUseClient; //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
m_pRecordset->Open(_variant_t(sql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
m_nResultRow = m_pRecordset->GetRecordCount(); //得到查询结果的行数
}
catch(_com_error&e)
{
AfxMessageBox(e.Description()+"E");
return FALSE;
}
return TRUE;
}
BOOL CAdoAcc::OpenTable(CString strTable,CStringArray& Result)
{
if(OpenTable(strTable)!=0)
{
Result.RemoveAll();
_variant_t value;
for(int i=0;i<m_nResultRow;i++)
{
for(int j=0;j<m_nResultCol;j++)
{
value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
if(value.vt==3||value.vt==14)
{
CString strTrans;
strTrans.Format("%ld",value.intVal);
Result.Add(strTrans);
}
else
if(value.vt==7)
{
COleDateTime time = value.date;
CString strTemp;
strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
Result.Add(strTemp);
}
else
Result.Add(value.bstrVal);//
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
return TRUE;
}
else
{
return FALSE;
}
}
/////////////////////////////////////////////////////////////////////////////
///关闭结果集
/////////////////////////////////////////////////////////////////////////////
void CAdoAcc::CloseRecordset()
{
if(m_pRecordset->State != adStateClosed)
m_pRecordset->Close();
}
BOOL CAdoAcc::ExecuteTrans(CStringArray& aSql)
{
try{
int nNum = aSql.GetSize();
m_pConnection->BeginTrans();
for(int i=0;i<nNum;i++)
{
CString strSql = aSql.GetAt(i);
m_pConnection->Execute((_bstr_t)aSql.GetAt(i),NULL,adCmdText);
}
m_pConnection->CommitTrans();
return TRUE;
}
catch(_com_error& e)
{
m_pConnection->RollbackTrans();
AfxMessageBox(e.Description()+"F");
return FALSE;
}
}
void CAdoAcc::MoveNext()
{
if(m_pRecordset->GetadoEOF()!=VARIANT_TRUE)
{
m_pRecordset->MoveNext();
}
}
BOOL CAdoAcc::AdoEOF()
{
if(m_pRecordset->GetadoEOF()!=VARIANT_TRUE)
return false;
else
return true;
}
CString CAdoAcc::GetValues(CString columnName)
{
try
{
return (char *)(_bstr_t)m_pRecordset->GetCollect(_variant_t(columnName));
}
catch(_com_error e)
{
throw e;
}
}
CString CAdoAcc::GetValues(int col)
{
try
{
_variant_t vt;
vt.vt=VT_I4;
vt.iVal=col;
return (char *)(_bstr_t)m_pRecordset->Fields->Item[(long)(col)]->Value;;
}
catch(_com_error e)
{
throw e;
}
}
int CAdoAcc::GetInt(CString columnName)
{
try
{
return (short)m_pRecordset->GetCollect(_variant_t(columnName));
}
catch(_com_error e)
{
throw e;
}
}
void CAdoAcc::CloseCommand()
{
if(m_pCommand->State!=adStateClosed)
m_pCommand->Release();
m_pCommand = NULL;
}
- vc++ ado访问类 CAdoAcc.h
- VC之ADO访问类
- vc 访问数据库ADO
- vc 中 ado 访问数据库
- Vc调用ado访问数据库
- VC++ ADO访问数据库笔记
- VC用ADO访问数据库
- VC下Ado访问ACCESS
- VC用ADO访问数据库
- VC用ADO访问数据库
- VC用ADO访问数据库
- vc下ADO访问数据库
- VC用ADO访问数据库
- VC通过ADO访问Excell
- VC利用ADO访问数据库
- VC用ADO访问数据库全攻略
- VC用ADO访问数据库全攻略
- VC调用ADO访问ACCESS数据库
- git xcrun: error: invalid active developer path
- UEditor 图片视频上传
- turtlebot gmapping with Hokuyo
- 从paxos到zookeeper读书笔记(第四章)
- HDU 1035 Robot Motion
- vc++ ado访问类 CAdoAcc.h
- 有哪几种方式获得Class类对象(实例)的方法?和对反射的理解和作用?
- Javascript知识点总结
- get和post请求区别
- python XPath表达式基础
- 图形界面
- EJB 事务
- RedHat安装yum的方法总结
- 交换机Vlan模式