寫入本地檔案到資料庫
void DlgImpRoadSection::OnOkBtnClicked(){#pragma region 驗證CString tempStr;CString fileName;m_FilePath.GetWindowText(fileName);if (access((const char*)_bstr_t(fileName), 0) != 0){ads_alert(L"檔案不存在!");return;}...#pragma endregion#pragma region 以二進位形式讀檔案。存入varBlobCFile file;if (file.Open(fileName, CFile::modeRead|CFile::typeBinary) == FALSE){return;}long fileLen = file.GetLength(); // 檔案長度// 存放檔案二進位流的指標byte *fileBuffer = new byte[fileLen + 1]; file.Read(fileBuffer, fileLen);file.Close();// 指定一個一維安全陣列(safe array)的邊界SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0;rgsabound[0].cElements = fileLen;// 安全陣列SAFEARRAY *safeArray; safeArray = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < fileLen; i++){SafeArrayPutElement (safeArray, &i, fileBuffer++); }// 存入資料庫中的BLOB的類型資料。設定為BYTE類型的數組VARIANT varBLOB;varBLOB.vt = VT_ARRAY | VT_UI1;varBLOB.parray = safeArray; #pragma endregion#pragma region 插入記錄CString sql = L"select * from TABLE_NAME where 1 = 0";_RecordsetPtr rs;rs.CreateInstance(__uuidof(Recordset));try{if (rs->Open(sql.GetBuffer(0), g_conn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText) == S_FALSE){return;}GUID guid;CoCreateGuid(&guid);CString id;id.Format(L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);rs->AddNew();rs->PutCollect("ID", _variant_t(id));rs->PutCollect("...", ...);rs->PutCollect("CAD_FILE", _variant_t(""));rs->GetFields()->GetItem("FILE")->AppendChunk(varBLOB);if (rs->Update() == S_OK){...}else{...}}catch(...){...}rs = NULL;#pragma endregionCDialog::OnOK();}
讀取資料庫blob欄位值,存到本地檔案。
#pragma region 從資料庫讀取檔案存到本地CString tempFile; // 要儲存到本地檔案名稱。_RecordsetPtr rs;rs.CreateInstance(__uuidof(Recordset));CString sql;sql.Format(L"select FILE from tablename where id = '%s'", id);try{if (rs->Open(sql.GetBuffer(0), g_conn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText) == S_FALSE){return false;}if (rs->adoEOF){return false;}long dataSize = rs->GetFields()->GetItem("FILE")->ActualSize;if (dataSize < 0){return false;}_variant_t varBlob = rs->GetFields()->GetItem("FILE")->GetChunk(dataSize);;if(varBlob.vt == (VT_ARRAY | VT_UI1)) //判斷資料類型是否正確{char *pBuf = NULL;SafeArrayAccessData(varBlob.parray, (void **)&pBuf); //得到指向資料的指標CFile cadFile;tempFile = appPath + "\\temp.dwg";;if (cadFile.Open(tempFile, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary) == FALSE){return false;}cadFile.Write(pBuf, dataSize);cadFile.Close();SafeArrayUnaccessData (varBlob.parray);}}catch (...){return false;}#pragma endregion