C++ ADO 实用封装类

实用ado封装,连接SQL SERVER,ORACLE

bool open(const string &connectstr)打开成功则返回true,否则返回false。

void query(const string&SQLSTR)初始化SQL字符串,参数用?占位符表示,可带不定参数。

void prepare(const int &)

void prepare(const double &)

void prepare(const string &)

重载函数,添加参数。

void exec()执行SQL语句。

vector<string> getrecord(const int &columncount,_variant_t...)返回字段结果集。

//头文件
#ifndef SQL_H
#define SQL_H
#import "msado15.dll" no_namespace rename("EOF","adoEOF")
#include<string>
#include<iostream>
#include<vector>
#include<stdarg.h>

class sql
{
private:
	HRESULT  hr ;
	_ConnectionPtr m_connection;
	_CommandPtr m_command;
	_RecordsetPtr m_recordset;
	std::string SQLSTR;
	std::vector<std::string> record;
public:
        sql();
	~sql();
	bool open(const std::string&strConnect);
        bool exec();
	void prepare(const int &index,const std::string&parameter);
	void query(const std::string&SQLSTR);
	void prepare(const int &_index, const int &para);
	void prepare(const int &, const double &para);
	std::vector<std::string> getRecord(const int columncount,...);
};
#endif SQL_h
const int commandTimeout = 30;
#include<iostream>
#include<string>
#include"sql.h"
#include<typeinfo>
#include<stdarg.h>
void sql::query( const std::string&SQLStr)
{
    SQLSTR = SQLStr;
}
bool sql::exec()
{
	m_command->ActiveConnection = m_connection;
	//m_command->CommandTimeout = commandTimeout;
	m_command->CommandText = SQLSTR.c_str();
	m_command->CommandType = adCmdText;
	try {
	   m_recordset= m_command->Execute(NULL, NULL, adCmdText);
		return true;
	}
	catch (_com_error &e)
	{
		std::cout << e.Description() << std::endl;
		return false;
	}
}
void sql::prepare(const int &_index,const std::string &para)
{
	std::string parameter;
	parameter = "'" +para+ "'";
	int index = SQLSTR.find("?");
	SQLSTR.insert(index, parameter);
	SQLSTR = SQLSTR.substr(0, (index + parameter.length()))+ SQLSTR.substr(index + parameter.length()+1, SQLSTR.length());
}
void sql::prepare(const int &_index, const int &para)
{
	std::string parameter = std::to_string(para);
	int index = SQLSTR.find("?");
	SQLSTR.insert(index, parameter);
	SQLSTR = SQLSTR.substr(0, (index + parameter.length())) + SQLSTR.substr(index + parameter.length() + 1, SQLSTR.length());
}
void sql::prepare(const int &_index, const double &para)
{
	std::string parameter = std::to_string(para);
	int index = SQLSTR.find("?");
	SQLSTR.insert(index, parameter);
	SQLSTR = SQLSTR.substr(0, (index + parameter.length())) + SQLSTR.substr(index + parameter.length() + 1, SQLSTR.length());
}
sql::sql()
{
	hr = CoInitialize(NULL);
	if(FAILED(m_connection.CreateInstance(_uuidof(Connection))))
		std::cout<<"connection eror"<<std::endl;
	if(FAILED(m_recordset.CreateInstance(_uuidof(Recordset))))
		std::cout<<"Recordset error"<<std::endl;
	if (FAILED(m_command.CreateInstance(_uuidof(Command))))
		std::cout << "Command error" << std::endl;
}
sql::~sql()
{
	m_connection->Close();
	CoUninitialize();
}
bool sql::open(const std::string&strConnect)
{
	if (NULL == m_connection)
		try
	{
		m_connection->CommandTimeout = 30;
		m_connection->Open(strConnect.c_str(), "", "", NULL);
		std::cout << "数据库连接成功" << std::endl;
		return true;
		//}
	}
	catch (_com_error &e)
	{
		std::cout << e.Description() << std::endl;
		std::cout << "连接数据库失败" << std::endl;
		return false;
	}
	else
		try
	{
		m_connection->CommandTimeout = 30;
		m_connection->Open(strConnect.c_str(), "", "", NULL);
		std::cout << "数据库连接成功" << std::endl;
		return true;
	}
	catch (_com_error &e)
	{
		std::cout << e.Description() << std::endl;
		std::cout << "连接数据库失败" << std::endl;
		return false;
	}
}

std::vector<std::string> sql::getRecord(const int columncout,...)
{
	m_recordset->MoveFirst();
	while (!m_recordset->adoEOF)
	{
		va_list va_ptr;
		va_start(va_ptr, columncout);
		std::string restr;
		_variant_t revar;
		_variant_t parm;
		for (int i = 0; i < columncout; i++)
		{
			parm = va_arg(va_ptr, _variant_t);
			revar = m_recordset->GetCollect(parm);
			if (i < (columncout - 1))
			{
				restr += (char*)_bstr_t(revar);
				restr += ",";
			}
			else
			{
				restr += (char*)_bstr_t(revar);
			}
		}
		record.push_back(restr);
		m_recordset->MoveNext();
	}
	m_recordset->Close();
	return record;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值