丰富自己的代码库-SqlServerHelper(Ado)
设计思路很简单,就是把数据封装为DataTable类,封装了类型转换,使用者可以不必考虑任何类型转换,而使用VC提供的CString即可。封装了按行号查找功能,先看代码
#pragma once
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF") #ifndef _SQLSERVERHELPER_H
#define _SQLSERVERHELPER_H
#include<list>
#include "stdafx.h" struct PageInfo
{
int PageCount;
int PageSize;
int PageIndex;
}; class DataTable
{
public:
DataTable();
DataTable(_RecordsetPtr& ptr);
~DataTable(void); void SetPtr(_RecordsetPtr& ptr);
UINT GetColumnCount();
UINT GetRowCount();
BOOL Update();
BOOL GetColumnName(long columnIndex,CString &str);
BOOL GetColumnValue(long columnIndex,CString &str);
BOOL SetColumnValue(long columnIndex,CString &str); BOOL SetValue(CString colName,CString str);
BOOL GetValue(CString colName,CString &str);
BOOL GetValue(long rowIndex,CString colName,CString &str);
BOOL SetValue(long rowIndex,CString colName,CString str); template<class T>
BOOL SetGenValue(CString colName,T val);
template<class T>
BOOL GetGenValue(CString colName,T& val); void MoveToRow(long rowIndex);
BOOL GetColumnValue(long columnIndex,long rowIndex,CString &str);
BOOL SetColumnValue(long columnIndex,long rowIndex,CString &str); _RecordsetPtr& GetSet();
private:
_RecordsetPtr m_pSet;
void NoUserFun();
}; class AdoHelper
{
public:
AdoHelper(void);
~AdoHelper(void); BOOL Close();
void ClearError();
BOOL Open(CString str);
_com_error GetLastError();
BOOL Open(CString str,BOOL openTrans);
BOOL OpenSql(CString sql,DataTable &table);
BOOL OpenTable(CString tableName,DataTable &table);
BOOL GetPagInfo(CString tableName,CString whereStr,PageInfo &info,DataTable &table); FieldsPtr& GetTable();
UINT ExcuteNoQuery(CString sqlStr);
//UINT ExcuteNoQuery(CString sqlStr,void* params,int paramLength);
BOOL Excute(CString sqlStr,DataTable &table);
private:
BOOL useTrans;
_CommandPtr m_pCmd;
_RecordsetPtr m_pSet;
_ConnectionPtr m_pCon;
std::list<_com_error> erorList;
};
#endif
以下是实现代码
#include "stdafx.h"
#include "SqlServerHelper.h" void DataTable::NoUserFun()
{
this->SetGenValue<int>(L"",0);
this->SetGenValue<long>(L"",0l);
int val;
this->GetGenValue<int>(L"",val);
long b;
this->GetGenValue<long>(L"",b);
} void DataTable::MoveToRow(long rowIndex)
{
this->m_pSet->MoveFirst();
for(int i=0;i<rowIndex;i++)
this->m_pSet->MoveNext();
} template<class T>
BOOL DataTable::SetGenValue(CString colName,T val)
{
if(!m_pSet)return FALSE; this->m_pSet->PutCollect(_variant_t(colName),_variant_t(val)); return TRUE;
} template<class T>
BOOL DataTable::GetGenValue(CString colName,T& val)
{
if(!m_pSet)return FALSE; val = (T)(_variant_t)(this->m_pSet->GetCollect(_variant_t(colName))); return TRUE;
} DataTable::DataTable(_RecordsetPtr& ptr)
{
this->m_pSet.CreateInstance(__uuidof(Recordset));
this->m_pSet = ptr;
} _RecordsetPtr& DataTable::GetSet()
{
return this->m_pSet;
} BOOL DataTable::Update()
{
HRESULT hr; hr = this->m_pSet->Update(); return SUCCEEDED(hr);
} void DataTable::SetPtr(_RecordsetPtr& ptr)
{
this->m_pSet = ptr;
} DataTable::DataTable()
{
this->m_pSet.CreateInstance(__uuidof(Recordset));
} DataTable::~DataTable(void)
{
this->m_pSet->Close();
} UINT DataTable::GetRowCount()
{
if(!m_pSet)return 0; return this->m_pSet->GetRecordCount();
} UINT DataTable::GetColumnCount()
{
if(!m_pSet)return 0; return this->m_pSet->Fields->Count;
} BOOL DataTable::GetColumnName(long columnIndex,CString &str)
{
if(!m_pSet)return FALSE; str = (LPCSTR)this->m_pSet->Fields->GetItem(columnIndex)->Name; return TRUE;
} BOOL DataTable::GetColumnValue(long columnIndex,CString &str)
{
if(!m_pSet)return FALSE; str = (LPCSTR)(_bstr_t)this->m_pSet->Fields->GetItem(columnIndex)->Value;
return TRUE;
} BOOL DataTable::SetColumnValue(long columnIndex,CString &str)
{
if(!m_pSet)return FALSE; this->m_pSet->Fields->GetItem(columnIndex)->Value = (_bstr_t)str; return TRUE;
} BOOL DataTable::GetColumnValue(long columnIndex,long rowIndex,CString &str)
{
if(!m_pSet)return FALSE;
if(rowIndex>=this->m_pSet->GetRecordCount())return FALSE; this->MoveToRow(rowIndex); str = (LPCSTR)(_bstr_t)this->m_pSet->Fields->GetItem(columnIndex)->Value; return TRUE;
} BOOL DataTable::SetColumnValue(long columnIndex,long rowIndex,CString &str)
{
if(!m_pSet)return FALSE;
if(rowIndex>=this->m_pSet->GetRecordCount())return FALSE; this->MoveToRow(rowIndex); this->m_pSet->Fields->GetItem(columnIndex)->Value = (_bstr_t)str; return TRUE;
} BOOL DataTable::SetValue(CString colName,CString str)
{
if(!m_pSet)return FALSE; this->m_pSet->PutCollect(_variant_t(colName),_variant_t(str)); return TRUE;
} BOOL DataTable::GetValue(CString colName,CString &str)
{
if(!m_pSet)return FALSE; str = (LPCTSTR)(_bstr_t)(this->m_pSet->GetCollect(_variant_t(colName))); return TRUE;
} BOOL DataTable::GetValue(long rowIndex,CString colName,CString &str)
{
if(!m_pSet)return FALSE; this->MoveToRow(rowIndex); str = (LPCTSTR)(_bstr_t)(this->m_pSet->GetCollect(_variant_t(colName))); return TRUE;
}
BOOL DataTable::SetValue(long rowIndex,CString colName,CString str)
{
if(!m_pSet)return FALSE; this->MoveToRow(rowIndex); this->m_pSet->PutCollect(_variant_t(colName),_variant_t(str)); return TRUE;
} AdoHelper::AdoHelper(void)
{
::CoInitialize(NULL);
HRESULT hr; hr = this->m_pCon.CreateInstance(__uuidof(Connection));
ASSERT(SUCCEEDED(hr)); hr = this->m_pSet.CreateInstance(__uuidof(Recordset));
ASSERT(SUCCEEDED(hr)); hr = this->m_pCmd.CreateInstance(__uuidof(Command));
ASSERT(SUCCEEDED(hr));
} AdoHelper::~AdoHelper(void)
{
try
{
m_pSet->Close();
}
catch(_com_error e)
{
} try
{
m_pCon->Close();
}
catch(_com_error e)
{ }
::CoUninitialize();
} void AdoHelper::ClearError()
{
this->erorList.clear();
} BOOL AdoHelper::Open(CString str)
{
HRESULT hr;
try
{
hr = m_pCon->Open((_bstr_t)str,"","",adConnectUnspecified); return SUCCEEDED(hr);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
this->erorList.push_back(e);
return FALSE;
}
} BOOL AdoHelper::Open(CString str,BOOL openTrans)
{
BOOL openSucceeded = this->Open(str);
this->useTrans = openTrans; if(!this->m_pCon)return FALSE; long result = this->m_pCon->BeginTrans(); return result==0;
} BOOL AdoHelper::Close()
{
if(useTrans)
{
if(!erorList.empty())
this->m_pCon->RollbackTrans();
else
this->m_pCon->CommitTrans(); }
return TRUE;
} _com_error AdoHelper::GetLastError()
{
_com_error error = this->erorList.front(); this->erorList.pop_front(); return error;
} BOOL AdoHelper::OpenTable(CString tableName,DataTable& table)
{
if(!m_pCon)return FALSE; try
{
HRESULT hr; hr = m_pSet->Open(_variant_t(tableName),(IDispatch*)m_pCon,adOpenKeyset,adLockOptimistic,adCmdTable);
table.SetPtr(m_pSet); return SUCCEEDED(hr);
}
catch(_com_error e)
{
this->erorList.push_back(e);
return FALSE;
}
} BOOL AdoHelper::OpenSql(CString sql,DataTable &table)
{
if(!m_pCon)return FALSE; try
{
HRESULT hr; hr = m_pSet->Open(_variant_t(sql),(IDispatch*)m_pCon,adOpenKeyset,adLockOptimistic,adCmdText);
table.SetPtr(m_pSet); return SUCCEEDED(hr);
}
catch(_com_error e)
{
this->erorList.push_back(e);
return FALSE;
}
} FieldsPtr& AdoHelper::GetTable()
{
ASSERT(m_pSet!=NULL);
return this->m_pSet->Fields;
} UINT AdoHelper::ExcuteNoQuery(CString sqlStr)
{
try
{
this->m_pCmd->ActiveConnection= this->m_pCon;
this->m_pCmd->CommandText=(_bstr_t)sqlStr;
this->m_pCmd->CommandType=adCmdText;
this->m_pCmd->Parameters->Refresh();
variant_t count;
this->m_pCmd->Execute(&count,NULL,adCmdText);
return (int)count;
}
catch(_com_error e)
{
this->erorList.push_back(e);
return 0;
}
} BOOL AdoHelper::Excute(CString sqlStr,DataTable& table)
{
try
{
this->m_pCmd->ActiveConnection= this->m_pCon;
this->m_pCmd->CommandText=(_bstr_t)sqlStr;
this->m_pCmd->CommandType=adCmdText;
this->m_pCmd->Parameters->Refresh();
variant_t count;
table.SetPtr(this->m_pCmd->Execute(&count,NULL,adCmdText));
return (int)count;
}
catch(_com_error e)
{
this->erorList.push_back(e);
return 0;
}
} BOOL AdoHelper::GetPagInfo(CString tableName,CString whereStr,PageInfo &info,DataTable &table)
{
if(!m_pCon)return FALSE; try
{
CString sql;
sql.Format(L"select count(*) c from %s where 1=1 %s;",tableName,whereStr); _RecordsetPtr ptr;
this->m_pCmd->ActiveConnection= this->m_pCon;
this->m_pCmd->CommandText=(_bstr_t)sql;
this->m_pCmd->CommandType=adCmdText;
this->m_pCmd->Parameters->Refresh();
variant_t count;
ptr=this->m_pCmd->Execute(&count,NULL,adCmdText);
int allCount = atoi((_bstr_t)ptr->GetCollect("c")); info.PageCount=(allCount+info.PageSize-1)/info.PageSize;
ptr->Close(); HRESULT hr; sql.Format(L"select top %d * from (select row_number() over (order by [Id]) rownumber,* from %s where 1=1 %s) tt where rownumber>%d;",info.PageSize,tableName,whereStr,(info.PageIndex-1)*(info.PageSize)); hr = m_pSet->Open(_variant_t(sql),(IDispatch*)m_pCon,adOpenStatic,adLockReadOnly,adCmdText);
table.SetPtr(m_pSet); return SUCCEEDED(hr);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
this->erorList.push_back(e);
return FALSE;
}
}
丰富自己的代码库-SqlServerHelper(Ado)的更多相关文章
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- 打造smali代码库辅助分析
打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...
- Overview of the Oppia codebase(Oppia代码库总览)
Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written ...
- 我的github代码库
我的github代码库地址:https://github.com/gooree.Enjoy coding,enjoy sharing.
- 使用GitHub for Windows客户端管理京东代码库项目
1.下载并安装 GitHub for Windows 客户端 https://windows.github.com/ 2.在京东代码库中新的代码库,可以创建私有的代码库 https://code.jd ...
- git代码库误操作还原记录
先做一些前情提要: 我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具.以下几乎所有操作都是在乌龟git上进行. 我们的项目是分阶段完成的,在完成上一阶 ...
- 15分钟学会使用Git和远程代码库
git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...
- linux下搭建svn代码库
1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get ...
- 针对远程Git代码库使用SSH公匙
→ 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...
随机推荐
- 【学】AngularJS日记(1) - 常用工具
angular.isArray(a) 判断a是否为数组 angular.isDate 是否为时间对象 angular.isDefined 判断元素是否存在 angular.isUndefined an ...
- 【总结】JS里的数组排序
虽然贴了2种办法,但是思路是一致的,都是先从数组里找出最小值,一种是找到一个放进新数组: 另一种是找到后和第i个数交换,i每次自增 主要用到2个函数: 从一个数组里找出最小值: 两个元素互换位置 fu ...
- 使用Squirrel创建基于Electron开发的Windows 应用安装包
我们把自己开发的Electron应用发布之前,需要把app打包成简单的安装包,这样app更容易被获取,以此来发布我们的应用.我们可以参考Wix或其他的安装程序,但是对于Electron应用更好的打包程 ...
- ORA-12519, ORA-00020异常产生原因及解决方案
近期在做项目的过程中,使用oracle时碰到了如下两个异常: ORA-12519, TNS:no appropriate service handler found: ORA-00020:maximu ...
- Cacti监控Centos抓包unreachable - admin prohibited
:: 抓包发现总是有这个出现,而且是跟在GetRequest后面. 打开iptables配置: 最开始网上找的配置语句是这个, -A INPUT -p udp -m udp --sport -j AC ...
- (Collection)350. Intersection of Two Arrays II
/* Given two arrays, write a function to compute their intersection. Example: Given nums1 = [1, 2, 2 ...
- BZOJ 3732 Network
2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...
- Android的各种Drawable 讲解 大全
Android把可绘制的对象抽象为Drawable,不同的图形图像资源就代表着不同的drawable类型.Android FrameWork提供了一些具体的Drawable实现,通常在代码中都不会直接 ...
- 《算法导论》 调用RANDOM(0,1),实现RANDOM(a,b)的过程
描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?(RANDOM(0,1)以等概率输出0或者1,RANDOM(a,b)以等概率 ...
- [转载]python操作excel使用win32com
原文链接:http://blog.163.com/yang_jianli/blog/static/16199000620138532243782/ 使用COM接口,直接操作EXCEL(只能在Win上) ...