用VC操作ADO总是觉得很烦琐。于是把ADO的常用操作封装了一下,以此降低代码量。之所以叫它半facade模式,因为没有导出内部Connection和Recordset等对象,而直接把它做成了一个句柄类。所以客户程序无法与底层ADO对象通讯。如果需要精细操作ADO,可以加个GET方法导出一下m_pData的m_pCnn或者m_ppRec。
这个类有一点特别的是,有GetActiveRecordset / SetActiveRecordset方法,在打开Recordset后,当前打开的Recordset就成为ActiveRecordset,于是像GetFieldValue,MoveNext等操作就在这个Recordset上执行,OpenRecordset会返回当前成功打开的Recordset的标识。如果要操作其它的Recordset,调用一下SetActiveRecordset。
各个函数的参数枚举等说明在CPP文件中的函数注释中。
编译器:VC 2003
PS:使用前先CoInitialize(NULL);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// .h文件
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//
// Ado封装类
// 时间: 2006-02-08
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
#pragma once
#include <comutil.h>
#pragma comment(lib, "comsupp.lib")
struct ADODATA;
class CAdo
{
public:
CAdo(void);
virtual ~CAdo(void);
public:
//返回连接字符串
CString GetConnectString();
//返回数据库服务器名称
CString GetServerName(){return m_strServer;};
//返回数据库名称
CString GetDatabaseName(){return m_strDatabase;};
//返回用户名
CString GetUserName(){return m_strUser;};
//返回密码
CString GetPassword(){return m_strPass;};
//返回Connection连接状态
bool GetConnectOpen();
//返回当前活动记录集打开状态
bool GetRecordsetOpen();
//返回/设置ConnectionTimeout
int GetConnectionTimeout();
void SetConnectionTimeout(int nTimeOut);
//返回/设置CommandTimeout
int GetCommandTimeout();
void SetCommandTimeout(int nTimeOut);
//返回/设置ConnectMode
int GetConnectMode();
void SetConnectMode(int nMode);
//返回Version
CString GetVersion();
//设置当前的活动记录集
void SetActiveRecordset(int nRecordset);
//返回当前活动的记录集
int GetActiveRecordset(){return m_nActiveRS;};
//返回/设置记录位置
int GetAbsolutePosition();
void SetAbsolutePosition(int nPosition);
//返回/设置页位置
int GetAbsolutePage();
void SetAbsolutePage(int nPage);
//返回页数量
int GetPageCount();
//返回/设置页大小
int GetPageSize();
void SetPageSize(int nSize);
//返回/设置CacheSize
int GetCachSize();
void SetCachSize(int nSize);
//返回EditMode
int GetEditMode();
//返回Recordset状态
int GetRecordStatus();
//打开数据库连接
int OpenConnect(int nProvider, CString strServer, CString strDatabase,
CString strUser = "", CString strPass = "");
int OpenConnect(CString strCnnStr);
//关闭连接
void CloseConnect();
//开始事务
int BeginTrans();
//提交事务
int CommitTrans();
//取消事务
int RollbackTrans();
//执行非数据选取SQL
int Execute(CString strSql, int* pAffected = NULL);
//执行(sql server 2000)数据库脚本文件
int ExecuteSqlFile(CString strFile);
//打开记录集
int OpenRecordset(CString strSql, int &nRecordset, int nCursorType = 2, int nLockType = 3);
//关闭记录集
void CloseRecordset(int nRecordset);
//当前的活动记录集添加记录
int Add();
int Add(const _variant_t *pValues, int nNum);
//当前的活动记录集删除当前游标所指的记录
int Delete();
//当前的活动记录集更新当前游标所指的记录
int Update();
//当前的活动记录集退出当前执行状态
int Cancel();
//当前的活动记录集退出当前Update操作
int CancelUpdate();
//返回当前的活动记录集记录总数
int GetRecordCount();
//返回当前的活动记录集BOF属性
bool GetBOF();
//返回当前的活动记录集EOF属性
bool GetEOF();
//当前的活动记录集移动至第一条记录
int MoveFirst();
//当前的活动记录集移动至最后一条记录
int MoveLast();
//当前的活动记录集移动至上一条记录
int MovePrev();
//当前的活动记录集移动至下一条记录
int MoveNext();
//当前的活动记录集移动至指定记录
int Move(int nNum);
//返回字段数目
int GetFieldsCount();
//返回字段名称
CString GetFieldName(int nInd);
//返回字段类型
int GetFieldType(int nFieldInd);
//返回字段数值
_variant_t GetFieldValue(int nRecordInd, int nFieldInd); //记录由nRecordInd指定
_variant_t GetFieldValue(int nFieldInd); //当前记录
_variant_t GetFieldValue(CString strField); //当前记录
//返回一条记录的数值
int GetRecordValue(int nRecordInd, _variant_t *pValues, int nNum); //记录由nRecordInd指定
int GetRecordValue(_variant_t *pValues, int nNum); //当前记录
//设置字段数值
int SetFieldValue(int nRecordInd, int nFieldInd, const _variant_t &vValue); //记录由nRecordInd指定
int SetFieldValue(int nFieldInd, const _variant_t &vValue); //当前记录
int SetFieldValue(CString strField, const _variant_t &vValue); //当前记录
//设置一条记录的数值
int SetRecordValue(int nRecordInd, const _variant_t *pValues, int nNum); //记录由nRecordInd指定
int SetRecordValue(const _variant_t *pValues, int nNum); //当前记录
protected:
//数据库对象结构
ADODATA * m_pData;
//数据库服务器
CString m_strServer;
//数据库名称
CString m_strDatabase;
//登录用户
CString m_strUser;
//密码
CString m_strPass;
//当前活动的记录集
int m_nActiveRS;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// .cpp文件
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "./ado.h"
#include <deque>
using namespace std;
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" /
no_namespace rename("EOF", "EndOfFile")
struct ADODATA
{
//数据库连接
_ConnectionPtr m_pCnn;
//记录集
deque<_RecordsetPtr> m_ppRec;
};
CAdo::CAdo(void)
{
m_pData = new ADODATA;
if (m_pData != NULL)
{
m_pData->m_pCnn = NULL;
m_pData->m_pCnn.CreateInstance(__uuidof(Connection));
}
m_nActiveRS = -1;
}
CAdo::~CAdo(void)
{
if (m_pData != NULL)
{
try
{
//关闭所有记录集
for (int nCount = 0; nCount < m_pData->m_ppRec.size(); nCount++)
{
if (m_pData->m_ppRec[nCount] != NULL)
{
if (m_pData->m_ppRec[nCount]->State == adStateOpen)
{
if (!m_pData->m_ppRec[nCount]->BOF
&& !m_pData->m_ppRec[nCount]->EndOfFile)
{
//对于AddNew或者修改了数据,而未保存的状态
if (m_pData->m_ppRec[nCount]->EditMode == adEditAdd
|| m_pData->m_ppRec[nCount]->EditMode == adEditInProgress)
{
m_pData->m_ppRec[nCount]->CancelUpdate();
}
}
m_pData->m_ppRec[nCount]->Close();
}
}
}
//关闭数据库连接
if (m_pData->m_pCnn != NULL)
{
if (m_pData->m_pCnn->State != adStateClosed)
{
m_pData->m_pCnn->Close();
}
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return;
}
delete m_pData;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回连接字符串
// 参数: none
// 返回值: 数据库连接字符串
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
CString CAdo::GetConnectString()
{
if (m_pData->m_pCnn != NULL)
{
return m_pData->m_pCnn->GetConnectionString();
}
else
{
return "";
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回Connection连接状态
// 参数: none
// 返回值: 数据库连接状态
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
bool CAdo::GetConnectOpen()
{
if (m_pData->m_pCnn != NULL)
{
return (m_pData->m_pCnn->State != adStateClosed);
}
else
{
return false;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回当前活动记录集打开状态
// 参数: none
// 返回值: 记录集打开状态
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
bool CAdo::GetRecordsetOpen()
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
return m_pData->m_ppRec[m_nActiveRS]->State != adStateClosed;
}
else
{
return false;
}
}
///////////////////////////////////////////////////////////////////////
//
// 设置当前的活动记录集
// 参数: nRecordset 当前的活动记录集
// 返回值:none
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
void CAdo::SetActiveRecordset(int nRecordset)
{
if (nRecordset >= 0 && nRecordset < m_pData->m_ppRec.size())
{
m_nActiveRS = nRecordset;
}
}
///////////////////////////////////////////////////////////////////////
//
// 打开数据库连接(使用ConnectString+用户名、密码的方式连接数据库)
// 参数: nProvider 数据库驱动类型:
// 1、Microsoft.Jet.OLEDB
// 2、Microsoft.SQL.OLEDB
// 3、ORACLE.OLEDB
// 4、Microsoft.ODBC.OLEDB
// strServer 数据库服务器名称(JET和ODBC该参数忽略)
// strDatabase 数据库名称(JET:数据库文件名称;ODBC:DNS名称)
// strUser 用户名称
// strPass 登录密码
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::OpenConnect(int nProvider, CString strServer,
CString strDatabase, CString strUser, CString strPass)
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
CString strProvider;
CString strCnnStr;
if (m_pData->m_pCnn->State != adStateClosed)
{
return 3;
}
switch (nProvider)
{
case 1:
//"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=MyUserID;Password=MyPassword;"
strProvider = "Microsoft.Jet.OLEDB.4.0";
strCnnStr.Format("Provider=%s;Data Source=%s;",
strProvider, strDatabase);
break;
case 2:
//Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=SPROLL
//"Provider=SQLOLEDB;Data Source=serverName;"
//Initial Catalog=databaseName;
//User ID=MyUserID;Password=MyPassword;"
//strProvider = "SQLOLEDB.1";
strProvider = "SQLOLEDB";
strCnnStr.Format("Provider=%s;Data Source=%s;Initial Catalog=%s;User ID=%s;Password=%s",
strProvider, strServer, strDatabase, strUser,strPass);
break;
case 3:
//"Provider=MSDAORA;Data Source=serverName;User ID=MyUserID; Password=MyPassword;"
strProvider = "MSDAORA";
strCnnStr.Format("Provider=%s;Data Source=%s;Initial Catalog=%s;User ID=%s;Password=%s",
strProvider, strServer, strDatabase, strUser,strPass);
break;
case 4:
//"Provider=MSDASQL;DSN=dsnName;UID=MyUserID;PWD=MyPassword;"
strProvider = "MSDASQL";
strCnnStr.Format("Provider=%s;DSN=%s;UID=%s;PWD=%s",
strProvider, strDatabase, strUser,strPass);
break;
default:
break;
}
try
{
if (FAILED(m_pData->m_pCnn->Open(strCnnStr.GetBuffer(), strUser.GetBuffer(),
strPass.GetBuffer(), adConnectUnspecified)))
{
return 4;
}
m_strServer = strServer;
m_strDatabase = strDatabase;
m_strUser = strUser;
m_strPass = strPass;
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 打开数据库连接(使用ConnectString的方式连接数据库)
// 参数: strCnnStr 连接字符串
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::OpenConnect(CString strCnnStr)
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State != adStateClosed)
{
return 3;
}
try
{
if (FAILED(m_pData->m_pCnn->Open(strCnnStr.GetBuffer(), "", "", adConnectUnspecified)))
{
return 4;
}
m_strServer = "";
m_strDatabase = "";
m_strUser = "";
m_strPass = "";
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 关闭数据库连接
// 参数: strCnnStr 数据库连接字符串
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
void CAdo::CloseConnect()
{
if (m_pData->m_pCnn != NULL)
{
try
{
if (m_pData->m_pCnn->State == adStateClosed)
{
return;
}
else
{
m_pData->m_pCnn->Close();
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
}
}
}
///////////////////////////////////////////////////////////////////////
//
// 开始事务
// 参数: none
// 返回值:0 正确
// 时间: 2006-05-04
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::BeginTrans()
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State == adStateClosed)
{
return 3;
}
try
{
m_pData->m_pCnn->BeginTrans();
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 提交事务
// 参数: none
// 返回值:0 正确
// 时间: 2006-05-04
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::CommitTrans()
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State == adStateClosed)
{
return 3;
}
try
{
m_pData->m_pCnn->CommitTrans();
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 取消事务
// 参数: none
// 返回值:0 正确
// 时间: 2006-05-04
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::RollbackTrans()
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State == adStateClosed)
{
return 3;
}
try
{
m_pData->m_pCnn->RollbackTrans();
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 执行非数据选取SQL
// 参数: strSql SQL执行语句
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Execute(CString strSql, int* pAffected)
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State == adStateClosed)
{
return 3;
}
_bstr_t bstrSql;
_variant_t vtAffected;
try
{
bstrSql = strSql;
if (pAffected == NULL)
{
m_pData->m_pCnn->Execute(bstrSql, NULL, adCmdText | adExecuteNoRecords);
}
else
{
vtAffected.vt = VT_I4;
m_pData->m_pCnn->Execute(bstrSql, &vtAffected, adCmdText | adExecuteNoRecords);
*pAffected = vtAffected;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 执行(sql server 2000)数据库脚本文件
// 参数: strFile SQL脚本文件
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::ExecuteSqlFile(CString strFile)
{
//函数内不检查strFile的存在性,外部调用者须保证此点
//函数执行时,每次读取脚本文件中的10K长度的内容,执行完后,再进行下一次循环
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State == adStateClosed)
{
return 3;
}
//当前读取的脚本文件的位置
int nReadPos = 0;
//在循环时,当前读取操作读取的文件内容长度
int nRead;
//Sql脚本文件大小
int nLen = 0;
//临时变量,保存函数的返回值
int nReturn;
//查找GO关键字时,查找的起始位置
int nStartIndex;
//找到的GO关键字的位置
int nGoPos;
CString strRead;
//GO关键字之间的,需要执行的SQL语句内容
CString strSql;
//上一次读取的脚本内容中,未尾未读取完、未执行的脚本内容
CString strLeft;
//将脚本中的GO关键字转换为大写的GO
//通过查找脚本内容的所有带GO的词组,然后替换之
CString strGoWordU = "/xd/xaGO/xd/xa";
CString strGoWordUL = "/xd/xaGo/xd/xa";
CString strGoWordLU = "/xd/xagO/xd/xa";
CString strGoWordL = "/xd/xago/xd/xa";
//每次读取脚本文件的10K大小内容,保存在缓冲区中
BYTE* pucBuf = new BYTE[10241];
CFile filSql;
try
{
nReturn = filSql.Open(strFile, CFile::modeRead);
if (nReturn)
{
nLen = (int)filSql.GetLength();
while (nReadPos < nLen)
{
//每次读取脚本文件中的10K大小的内容,并执行
pucBuf[0] = '/0';
nRead = nReadPos + 10240 < nLen ? 10240 : nLen - nReadPos;
filSql.Read(pucBuf, nRead);
pucBuf[nRead] = '/0';
nReadPos += nRead;
nStartIndex = 0;
strRead = strLeft + (CString)pucBuf;
strRead.Replace(strGoWordUL, strGoWordU);
strRead.Replace(strGoWordLU, strGoWordU);
strRead.Replace(strGoWordL, strGoWordU);
while (true)
{
//执行两个GO之间的脚本内容
nGoPos = strRead.Find(strGoWordU, nStartIndex);
if (nGoPos >= 0)
{
if (nGoPos - nStartIndex > 0)
{
strSql = strRead.Mid(nStartIndex, nGoPos - nStartIndex);
strSql.Trim();
if (strSql.GetLength() > 0)
{
m_pData->m_pCnn->Execute(strSql.GetBuffer(), NULL, adCmdText | adExecuteNoRecords);
}
}
nStartIndex = nGoPos + 6;
}
else
{
if (strRead.GetLength() - nStartIndex > 0)
{
strLeft = strRead.Right(strRead.GetLength() - nStartIndex);
}
else
{
strLeft = "";
}
goto NextSegment;
}
}
NextSegment:
;
}
filSql.Close();
}
else
{
delete [] pucBuf;
return 5;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
delete [] pucBuf;
return 1;
}
delete [] pucBuf;
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 打开记录集
// 参数: strSql SQL执行语句
// nRecordset 返回记录集标识
// nCursorType 游标类型:
// 0,adOpenForwardOnly;
// 1,adOpenKeyset;
// 2,adOpenDynamic;
// 3,adOpenStatic;
// nLockType 锁定类型
// 1,adLockReadOnly
// 2,adLockPessimistic
// 3,adLockOptimistic
// 4,adLockBatchOptimistic
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::OpenRecordset(CString strSql, int &nRecordset, int nCursorType, int nLockType)
{
if (m_pData->m_pCnn == NULL)
{
return 2;
}
if (m_pData->m_pCnn->State == adStateClosed)
{
return 3;
}
int nIndex = -1;
for (int nCount = 0; nCount < m_pData->m_ppRec.size(); nCount++)
{
if (m_pData->m_ppRec[nCount]->State == adStateClosed)
{
nIndex = nCount;
break;
}
}
if (nIndex < 0)
{
_RecordsetPtr pResNew;
pResNew.CreateInstance(__uuidof(Recordset));
if (pResNew != NULL)
{
m_pData->m_ppRec.push_back(pResNew);
}
else
{
return 4;
}
nIndex = m_pData->m_ppRec.size() - 1;
}
_bstr_t bstrSql;
try
{
bstrSql = strSql;
m_pData->m_ppRec[nIndex]->CursorLocation = adUseClient;
m_pData->m_ppRec[nIndex]->Open(bstrSql, _variant_t((IDispatch *)m_pData->m_pCnn, true),
(CursorTypeEnum)nCursorType, (LockTypeEnum )nLockType, adCmdText);
nRecordset = nIndex;
m_nActiveRS = nIndex;
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 关闭记录集
// 参数: nRecordset 记录集标识
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
void CAdo::CloseRecordset(int nRecordset)
{
bool bMatch = false;
int nSize = m_pData->m_ppRec.size();
if (nRecordset >= 0 && nRecordset < nSize)
{
try
{
if (m_pData->m_ppRec[nRecordset]->State != adStateClosed)
{
m_pData->m_ppRec[nRecordset]->Close();
}
if (m_nActiveRS == nRecordset)
{
for (int nCount = 0; nCount < nSize; nCount++)
{
if (m_pData->m_ppRec[nCount]->State != adStateClosed)
{
m_nActiveRS = nCount;
bMatch = true;
break;
}
}
if (!bMatch)
{
m_nActiveRS = -1;
}
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
}
}
return;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集添加记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Add()
{
_variant_t vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->AddNew(vtEmpty, vtEmpty)))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集添加记录
// 参数: pData 按顺序保存各字段的数值
// nNum 数据数量
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Add(const _variant_t *pValues, int nNum)
{
int nReturn;
nReturn = Add();
if (nReturn)
{
return 2;//AddError(2, nReturn);
}
nReturn = SetRecordValue(pValues, nNum);
if (nReturn)
{
return 3;//AddError(3, nReturn);
}
nReturn = Update();
if (nReturn)
{
return 4;//AddError(4, nReturn);
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集删除当前游标所指的记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Delete()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->Delete(adAffectCurrent)))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集更新当前游标所指的记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Update()
{
_variant_t vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->Update(vtEmpty, vtEmpty)))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集退出当前执行状态
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Cancel()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->Cancel()))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集退出当前Update操作
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::CancelUpdate()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->CancelUpdate()))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 返回当前的活动记录集记录总数
// 参数: none
// 返回值: 记录总数,-2为出错(不返回-1是因为Recordset会返回-1)
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::GetRecordCount()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return -2;
}
else
{
return m_pData->m_ppRec[m_nActiveRS]->RecordCount;
}
}
else
{
return -2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return -2;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回当前的活动记录集BOF属性
// 参数: none
// 返回值: BOF
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
bool CAdo::GetBOF()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return true;
}
else
{
return m_pData->m_ppRec[m_nActiveRS]->BOF;
}
}
else
{
return true;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return true;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回当前的活动记录集EOF属性
// 参数: none
// 返回值: EOF
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
bool CAdo::GetEOF()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return true;
}
else
{
return m_pData->m_ppRec[m_nActiveRS]->EndOfFile;
}
}
else
{
return true;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return true;
}
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集移动至第一条记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::MoveFirst()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->MoveFirst()))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集移动至最后一条记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::MoveLast()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->MoveLast()))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集移动至上一条记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::MovePrev()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->MovePrevious()))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集移动至下一条记录
// 参数: none
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::MoveNext()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->MoveNext()))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 当前的活动记录集移动至指定记录
// 参数: nNum 移动的记录数目
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::Move(int nNum)
{
_variant_t vtBookmark = (LONG)adBookmarkFirst;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->Move(nNum, vtBookmark)))
{
return 4;
}
}
}
else
{
return 2;
}
}
catch(_com_error &e)
{
CString s = e.Description();
//SetSdkError(0, e.Error(), 0);
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// 返回字段数目
// 参数: none
// 返回值:正数 正确
// -1 错误
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::GetFieldsCount()
{
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return -1;
}
else
{
return m_pData->m_ppRec[m_nActiveRS]->Fields->Count;
}
}
else
{
return -1;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return -1;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回字段名称
// 参数: nInd 字段序号,从0开始
// 返回值: 字段名称,如果出错返回空字符串
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
CString CAdo::GetFieldName(int nInd)
{
_variant_t vtInd = (short)nInd;
FieldPtr pField;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return "";
}
else
{
if (nInd >= 0 && nInd < m_pData->m_ppRec[m_nActiveRS]->Fields->Count)
{
pField = m_pData->m_ppRec[m_nActiveRS]->Fields->GetItem(&vtInd);
return pField->Name;
}
else
{
return "";
}
}
}
else
{
return "";
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return "";
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回字段类型
// 参数: nInd 字段序号,从0开始
// 返回值: 字段类型,如果出错返回-1
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::GetFieldType(int nFieldInd)
{
_variant_t vtInd = (short)nFieldInd;
FieldPtr pField;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return -1;
}
else
{
if (nFieldInd >= 0 && nFieldInd < m_pData->m_ppRec[m_nActiveRS]->Fields->Count)
{
pField = m_pData->m_ppRec[m_nActiveRS]->Fields->GetItem(&vtInd);
return pField->Type;
}
else
{
return -1;
}
}
}
else
{
return -1;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return -1;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回字段数值
// 参数: nRecordInd 记录序号,从0开始
// nFieldInd 字段序号,从0开始
// 返回值: 字段数值,如果出错返回NULL变体
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
_variant_t CAdo::GetFieldValue(int nRecordInd, int nFieldInd)
{
_variant_t vtBookmark = (LONG)adBookmarkFirst;
_variant_t vtInd = (short)nFieldInd;
_variant_t vtNull;
vtNull.vt = VT_NULL;
FieldPtr pField;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return vtNull;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiveRS]->Move(nRecordInd, vtBookmark)))
{
return vtNull;
}
if (m_pData->m_ppRec[m_nActiveRS]->EndOfFile
|| m_pData->m_ppRec[m_nActiveRS]->BOF)
{
return vtNull;
}
if (nFieldInd >= 0 && nFieldInd < m_pData->m_ppRec[m_nActiveRS]->Fields->Count)
{
pField = m_pData->m_ppRec[m_nActiveRS]->Fields->GetItem(&vtInd);
return pField->Value;
}
else
{
return vtNull;
}
}
}
else
{
return vtNull;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return vtNull;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回字段数值
// 参数: nFieldInd 字段序号,从0开始
// 返回值: 字段数值,如果出错返回NULL变体
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
_variant_t CAdo::GetFieldValue(int nFieldInd)
{
_variant_t vtInd = (short)nFieldInd;
_variant_t vtNull;
vtNull.vt = VT_NULL;
FieldPtr pField;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return vtNull;
}
else
{
if (m_pData->m_ppRec[m_nActiveRS]->EndOfFile
|| m_pData->m_ppRec[m_nActiveRS]->BOF)
{
return vtNull;
}
if (nFieldInd >= 0 && nFieldInd < m_pData->m_ppRec[m_nActiveRS]->Fields->Count)
{
pField = m_pData->m_ppRec[m_nActiveRS]->Fields->GetItem(&vtInd);
return pField->Value;
}
else
{
return vtNull;
}
}
}
else
{
return vtNull;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return vtNull;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回字段数值
// 参数: strField 字段名称
// 返回值: 字段数值,如果出错返回NULL变体
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
_variant_t CAdo::GetFieldValue(CString strField)
{
_variant_t vtField;
_variant_t vtNull;
vtNull.vt = VT_NULL;
FieldPtr pField;
vtField = strField;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return vtNull;
}
else
{
if (m_pData->m_ppRec[m_nActiveRS]->EndOfFile
|| m_pData->m_ppRec[m_nActiveRS]->BOF)
{
return vtNull;
}
if (!strField.IsEmpty())
{
pField = m_pData->m_ppRec[m_nActiveRS]->Fields->GetItem(&vtField);
return pField->Value;
}
else
{
return vtNull;
}
}
}
else
{
return vtNull;
}
}
catch(_com_error &e)
{
//SetSdkError(0, e.Error(), 0);
return vtNull;
}
}
///////////////////////////////////////////////////////////////////////
//
// 返回一条记录的数值
// 参数: nRecordInd 记录序号,从0开始
// pValues 顺序保存每个字段数据的数组
// nNum 数组大小,如果小于字段数量,则只拷贝nNum大小的数据
// 返回值:0 正确
// 时间: 2006-02-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int CAdo::GetRecordValue(int nRecordInd, _variant_t *pValues, int nNum)
{
_variant_t vtBookmark = (LONG)adBookmarkFirst;
_variant_t vtInd;
FieldPtr pField;
int nFieldCount;
int nGetCount;
try
{
if (m_nActiveRS >= 0 && m_nActiveRS < m_pData->m_ppRec.size())
{
if (m_pData->m_ppRec[m_nActiveRS]->State == adStateClosed)
{
return 3;
}
else
{
if (FAILED(m_pData->m_ppRec[m_nActiv