yangyang12138

导航

丰富自己的代码库-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;
	}
}

  

posted on 2016-12-13 10:35  杨杨09265  阅读(162)  评论(0)    收藏  举报