1. 程式人生 > >VS2013 c++連結資料庫,應用儲存過程,向資料庫中寫入資料

VS2013 c++連結資料庫,應用儲存過程,向資料庫中寫入資料

// 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