丰富自己的代码库-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 ...
随机推荐
- C# dataTable 排序
DataView dv = ds.DefaultView; dv.Sort = "header asc"; ds = dv.ToTable(); C# dataTable 排序
- 公司系统的license授权
在我的电脑的myeclipse的whnaproject项目下.可直接编译生成license.xml中所需要的授权码. 引用了spring-license-0.02.jar. package com.w ...
- SpringToolSuite/Eclipse中集成的Tomcat无法add Project时的解决版本
- 微信调试、API、AJAX的调试 SocketLog
SocketLog适合Ajax调试和API调试, 举一个常见的场景,用SocketLog来做微信调试, 我们在做微信API开发的时候,如果API有bug,微信只提示"改公众账号暂时无法提供服 ...
- C#封装好的Win32API
Kernel.cs using System; using System.Runtime.InteropServices; using System.Text; using HANDLE = Syst ...
- Android高手速成
第一部分 个性化控件(View) http://www.cnblogs.com/huwei0814/p/3796659.html 第二部分 工具库 http://www.cnblogs.c ...
- 【javascript基础】系列
这是本人记录的javascript基础知识,希望能给大家的学习带来一点帮助. [javascript基础]1.基本概念 [javascript基础]2.函数 [javascript基础]3.变量和作用 ...
- jQuery的编码标准和最佳实践
不知道在哪里看到了这篇关于jQuery编码的文章,挺实用的,恰好最近在研究jQuery的基础知识,今天打开收藏夹来翻译一下,原文的英语不难,但是内容很实用,可能有大神已经翻译过了,大家看精华就行了. ...
- Access自动编号的初始值设置及重置编号
项目上需要在Access数据库,发现自动编号的列无法设置初始值和步长,但是可以使用SQL语句来设置它. 方法如下: ALTER TABLE tableName ALTER COLUMN ID COUN ...
- struts的标签库出现Failed to load or instantiate TagExtraInfo class
使用struts的标签库出现Failed to load or instantiate TagExtraInfo class 最近在使用struts标签库的时候,在eclipse开发环境中是正常的,放 ...