设计思路很简单,就是把数据封装为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)的更多相关文章

  1. iOS流行的开源代码库

    本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...

  2. 打造smali代码库辅助分析

    打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...

  3. Overview of the Oppia codebase(Oppia代码库总览)

    Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written ...

  4. 我的github代码库

    我的github代码库地址:https://github.com/gooree.Enjoy coding,enjoy sharing.

  5. 使用GitHub for Windows客户端管理京东代码库项目

    1.下载并安装 GitHub for Windows 客户端 https://windows.github.com/ 2.在京东代码库中新的代码库,可以创建私有的代码库 https://code.jd ...

  6. git代码库误操作还原记录

    先做一些前情提要: 我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具.以下几乎所有操作都是在乌龟git上进行. 我们的项目是分阶段完成的,在完成上一阶 ...

  7. 15分钟学会使用Git和远程代码库

    git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...

  8. linux下搭建svn代码库

    1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get ...

  9. 针对远程Git代码库使用SSH公匙

    → 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...

随机推荐

  1. AngularJS---自定义指令

    AngularJS提供了一系列的内置指令,如ng开头的指令,同时AngularJS也允许用户自定义指令. 目录: 1.自定义指令 2.使用自定义指令 3.自定义指令的内嵌使用 自定义指令 Angula ...

  2. [SI]source insight使用

    1. 快捷键 Ctrl+O: 工程中查找需要的文件如imx.c Ctrl+F: 当前文件查找字符串,然后Alt+W(hole)可以列出所有找到的位置 Ctrl+/:可以在当前project中查找字符串 ...

  3. 黄聪:解决Web部署 svg/woff/woff2字体 404错误

    问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...

  4. 安装中文版cacti监控华为交换机流量并实现95计费

    摘要:一. 装置yum源: 以网易yum源为例 1. 下载repo文件 下载地点:http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.备份并调换体 ...

  5. VMware下安装Linux系统,ORACLE软件,DBCA建库

    操作系统安装   在vmware下安装Linux (OEL5.6),用于数据库服务器 1.打开vmware,选择"创建新的虚拟机"       2.选择自定义安装   3.选择虚拟 ...

  6. tornado api 简单模板

    # 安装 pip insatll tornado # 主文件 web_server.py #!/usr/bin/env python # encoding: utf-8 import tornado. ...

  7. js 毫秒转日期(yy-MM-dd hh:mm:ss)

    var seconds = "133343241342";//毫秒数 var objtime = new Date();//声明一个日期内建函数 objtime.setTime(s ...

  8. Hyper-v之利用差异磁盘快速创建多个虚拟机

    在新建Hyper-v磁盘的时候 有3种选项 其中分别是 固定大小 动态扩展 和 差异(differencing,个人习惯叫 差分) 其中 固定大小是新建的时候 Hyper-v创建一个设置大小值的文件, ...

  9. recyleView使用笔记

    直接上代码: package com.test.recycleview; import android.app.Activity; import android.graphics.Canvas; im ...

  10. X-Cart 学习笔记(二)X-Cart框架1

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 四.X- ...