以下代码在vs2015中测试通过,使用标准Windows库。
连接SqlSerer和查询的代码是东拼西凑的,_variant_t 与 std::string 相互转换是自己翻书写的。
_variant_t 如果是日期、整数等其他数据类型,会自动转成std::string,没有乱码。
20200614更新,做了连接、增删改查、断开部分注释。
// SqlServerTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <ICRSINT.H>
#include <vector>
#include <iostream>
#include <String>
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
int main()
{
std::vector<std::string> v_strvalvec;//用来放查询结果
//初始化部分begin
CoInitialize(NULL);
_ConnectionPtr sqlSp;
HRESULT hr = sqlSp.CreateInstance(_uuidof(Connection));
if (FAILED(hr))
{
std::cout<<"_ConnectionPtr对象指针实例化失败!!!";
system("pause");
return 0;
}
else {
std::cout << "ok";
}
try {
_bstr_t strConnect = "Driver={sql server};server=127.0.0.1;uid=root;pwd = root;database=testdb;";
sqlSp->Open(strConnect, "", "", adModeUnknown);
if (sqlSp == NULL)
printf("conn error");
printf("conn ok");
}
catch (_com_error &e)
{
std::cout<<(e.Description());
system("pause");
return 0;
}
//初始化部分end
//增删改查begin
_RecordsetPtr m_pRecordset;
if (FAILED(m_pRecordset.CreateInstance(_uuidof(Recordset))))
{
std::cout << ("记录集对象指针实例化失败!");
}
try {
//std::string 转 _variant_t begin
std::string std_sqlstr = "select * from testTable";
char* c_sqlstr = const_cast<char*>(std_sqlstr.c_str());
_variant_t v_sqlstr = (LPSTR)c_sqlstr;
//std::string 转 _variant_t end
m_pRecordset->Open(v_sqlstr, (IDispatch*)sqlSp, adOpenDynamic, adLockOptimistic, adCmdText);
while(!m_pRecordset->adoEOF)//遍历所有记录
{
_variant_t TheValue;
TheValue = m_pRecordset->GetCollect("test");
//_variant_t转std::string begin
std::string strval = (char*)(_bstr_t)TheValue;
//_variant_t转std::string end
v_strvalvec.push_back(strval);
m_pRecordset->MoveNext();
}
for (int i = 0; i < v_strvalvec.size(); i++) {
std::string item = v_strvalvec.at(i);
std::cout <<std::endl << item;
}
}
catch (_com_error &e)
{
std::cout << (e.Description());
}
//增删改查end
//断开begin
sqlSp->Close();
::CoUninitialize();
//断开end
system("pause");
return 0;
}