实用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¶meter);
void query(const std::string&SQLSTR);
void prepare(const int &_index, const int ¶);
void prepare(const int &, const double ¶);
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 ¶)
{
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 ¶)
{
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 ¶)
{
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;
}