VS2013 c++链接数据库,应用存储过程,向数据库中写入数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40155090/article/details/81096776
// 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

https://blog.csdn.net/qq_40155090/article/details/80926342

猜你喜欢

转载自blog.csdn.net/qq_40155090/article/details/81096776