// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iomanip"
using namespace std;
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile")
//重定义VARIENT数据类型
void SetArrayToVariant(VARIANT & pvList, BYTE * ary, long alen){
SAFEARRAYBOUND saBound[1];
saBound[0].cElements = alen;
saBound[0].lLbound = 0;
SAFEARRAY *pSA = SafeArrayCreate(VT_UI1, 1, saBound);
for (long l = 0; l < (long)alen; l++)
{
SafeArrayPutElement(pSA, &l, (void*)&ary[l]);
}
VariantClear(&pvList);
pvList.vt = VT_UI1 | VT_ARRAY;
pvList.parray = pSA;
}
int _tmain(int argc, _TCHAR* argv[])
{
///
//变量声明,数据库中的字段,对应c++中的类型
_int64 id; // bigint Unchecked
int bvehicleid; // int Checked
wchar_t* number; // nvarchar(MAX) Checked
int cstreamid; // int Checked
_int64 tstart; // datetime Checked
_int64 tend; // datetime Checked
unsigned char* vector; // varbinary(MAX) Checked
wchar_t* path; // nvarchar(50) Checked
/
//赋值
bvehicleid = 123;
number = L"we123";
cstreamid = 12;
tstart = 12;
tend = 13;
vector =( unsigned char*) "123";
path = L"123";
/
//database operation
/
// connection
char strconn[] = "Provider=SQLOLEDB;Server=192.168.3.242;Database=go;uid=sa;pwd=123;";
CoInitialize(NULL); //初始化COM组件
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(Connection));// 创建Connection对象
try {
m_pConnection->Open("Provider=SQLOLEDB;Server=199.168.323.242;Database=gooo;uid=sa;pwd=123456;", "", "", adModeUnknown);//此处需要写自己需要连接的数据库ip,数据库名称gooo,登录名和密码
}
catch (_com_error e) {
string errorInfo = e.Description();
CoUninitialize();
return false;
}
_CommandPtr mCommandPtr;
mCommandPtr.CreateInstance(__uuidof(Command));
mCommandPtr->ActiveConnection = m_pConnection; //绑定_ConnectionPtr
mCommandPtr->CommandText = _bstr_t("[insertrVehicle]"); //存储过程名
mCommandPtr->CommandType = adCmdStoredProc; //命令类型为存储过程或事务等
/
//return table set
_RecordsetPtr mRecordsetPtr;
/
//执行存储过程
_ParameterPtr pParam[8];
//初始化pParam
pParam[0].CreateInstance(__uuidof(Parameter));
pParam[1].CreateInstance(__uuidof(Parameter));
pParam[2].CreateInstance(__uuidof(Parameter));
pParam[3].CreateInstance(__uuidof(Parameter));
pParam[4].CreateInstance(__uuidof(Parameter));
pParam[5].CreateInstance(__uuidof(Parameter));
pParam[6].CreateInstance(__uuidof(Parameter));
pParam[7].CreateInstance(__uuidof(Parameter));
//第一个参数为自定义的传递变量名,主要用于数据值得获取;第二个参数为变量类型;第三个为创建变量的类型;第四个为变量的长度
pParam[0] = mCommandPtr->CreateParameter(_bstr_t("@id"), DataTypeEnum::adInteger, adParamOutput, 8);
pParam[1] = mCommandPtr->CreateParameter(_bstr_t("@bvehicleid"), DataTypeEnum::adBigInt, adParamInput, 8);
//VARIANT 分为两个部分,先根据 vt设置类型,然后使用
VARIANT vart;
vart.vt = VT_INT;//设置
vart.intVal = bvehicleid;//使用
_variant_t vt;
vt.Attach(vart);
pParam[1]->Value = vt;
pParam[2] = mCommandPtr->CreateParameter(_bstr_t("@number"), DataTypeEnum::adBinary, adParamInput, 12);
VARIANT vart1;
SetArrayToVariant(vart1, (unsigned char *)number, 12);
_variant_t vt1;
vt1.Attach(vart1);
pParam[2]->Value = vt1;
pParam[3] = mCommandPtr->CreateParameter(_bstr_t("@cstreamid"), DataTypeEnum::adBigInt, adParamInput, 8);
VARIANT vart2;
vart2.vt = VT_INT;
vart2.intVal = cstreamid;
_variant_t vt2;
vt2.Attach(vart2);
pParam[3]->Value = vt2;
pParam[4] = mCommandPtr->CreateParameter(_bstr_t("@tstart"), DataTypeEnum::adInteger, adParamInput, 8);
VARIANT vart3;
vart3.vt = VT_I8;
vart3.llVal = tstart;
_variant_t vt3;
vt3.Attach(vart3);
pParam[4]->Value = vt3;
pParam[5] = mCommandPtr->CreateParameter(_bstr_t("@tend"), DataTypeEnum::adInteger, adParamInput, 8);
VARIANT vart4;
vart4.vt = VT_I8;
vart4.llVal = tend;
_variant_t vt4;
vt4.Attach(vart4);
pParam[5]->Value = vt4;
pParam[6] = mCommandPtr->CreateParameter(_bstr_t("@vector"), DataTypeEnum::adBinary, adParamInput, 10);
VARIANT vart5;
SetArrayToVariant(vart5, (unsigned char *)vector, 10);
_variant_t vt5;
vt5.Attach(vart5);
pParam[6]->Value = vt5;
pParam[7] = mCommandPtr->CreateParameter(_bstr_t("@path"), DataTypeEnum::adBinary, adParamInput, 8);
VARIANT vart6;
SetArrayToVariant(vart6, (unsigned char *)path, 8);
_variant_t vt6;
vt6.Attach(vart6);
pParam[7]->Value = vt6;//数据赋值时最好不要用NULL
/
//执行输入操作
mCommandPtr->Parameters->Append(pParam[0]);
mCommandPtr->Parameters->Append(pParam[1]);
mCommandPtr->Parameters->Append(pParam[2]);
mCommandPtr->Parameters->Append(pParam[3]);
mCommandPtr->Parameters->Append(pParam[4]);
mCommandPtr->Parameters->Append(pParam[5]);
mCommandPtr->Parameters->Append(pParam[6]);
mCommandPtr->Parameters->Append(pParam[7]);
BOOL bInsert = FALSE;
VARIANT vRecordsAffected; //设置执行影响数据库表中的行数
vRecordsAffected.vt = VT_I4;
vRecordsAffected.lVal = 0;
mRecordsetPtr = mCommandPtr->Execute(&vRecordsAffected, NULL, adCmdStoredProc);
id = (_int64)pParam[0]->Value;
///
//释放变量和内存
mCommandPtr.Release();
mRecordsetPtr->Release();
CoUninitialize();
return 0;
}
注:在使用ip地址链接数据库库时设置好SQL server配置管理,SQL server默认不允许远程链接,参考SQL server配置管理
https://jingyan.baidu.com/article/93f9803f217eafe0e46f55af.html