VS2013 c++連結資料庫,應用儲存過程,向資料庫中寫入資料
阿新 • • 發佈:2018-11-04
// 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