1. 程式人生 > >使用c++和Ado向Oracle資料庫中插入圖片

使用c++和Ado向Oracle資料庫中插入圖片

    最近因為專案需要,需要將圖片插入至Oracle,現簡單總結如下:

    1.引入ado

#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF")

    2.建立oracle資料庫連線,插入圖片。

//例項化連線物件
	HRESULT hr;
	_ConnectionPtr connPtr;
	hr=connPtr.CreateInstance(__uuidof(Connection));
	if (SUCCEEDED(hr))
	{
		//連線Oracle資料庫
		char* con="Provider=OraOLEDB.Oracle.1;Persist Security Info=True;Data Source=192.168.1.22:1521/Server2";
		char* userID="admin";
		char* passWord="123";
		hr=connPtr->Open(con,userID,passWord,NULL);
		if (SUCCEEDED(hr))
		{
			//圖片流及圖片大小
			int picLength=1000;
			char* picData=new char[picLength];
			
			char* sql="select * from tb_pic where picid='aaa'";
			//例項化命令物件
			_RecordsetPtr rstPtr;
			rstPtr.CreateInstance(__uuidof(Recordset));
			if (rstPtr->Open(sql,connPtr.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText)==S_OK)
			{
				//構造安全陣列
				SAFEARRAYBOUND rgsbound[1];
				rgsbound[0].lLbound=0;
				rgsbound[0].cElements=picLength;
				SAFEARRAY *safeArray;
				safeArray=SafeArrayCreate(VT_UI1,1,rgsbound);
				for (long i=0;i<picLength;i++)
				{
					SafeArrayPutElement(safeArray,&i,picData++);
				}
				VARIANT varBlob;
				varBlob.vt=VT_ARRAY|VT_UI1;
				varBlob.parray=safeArray;

				//建立新紀錄
				rstPtr->AddNew();
				rstPtr->PutCollect("picid","aaa");
				rstPtr->GetFields()->GetItem("picdata")->AppendChunk(varBlob);
				//插入
				rstPtr->Update();
				SafeArrayDestroy(safeArray);
			}
		}
	}