版權聲明:歡迎評論和轉載,轉載請注明來源。 https://blog.csdn.net/zy332719794/article/details/7407158
寫入本地檔案到資料庫
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 以二進制形式讀檔案。存入varBlob
CFile 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 endregion
CDialog::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