Access数据库位图文件数据的读写(一)

读取位图文件到VARIANT结构中

/*
    从位图文件中读取数据到VARIANT
    参数:
        pBitmapPath        位图文件路径
        varVal            VARIANT结构
        dwFileSize        文件大小

*/
HRESULT QAdo::ReadBitmapFileToVariant(const char* pBitmapPath, VARIANT& varVal,DWORD* fileSize)
{
    HRESULT hr = S_OK;
    BYTE* pBuffer = nullptr;
    //DWORD fileSize = 0;
    SAFEARRAY* psa = nullptr;
    void* pData = nullptr;

    //1.读取图片文件
    hr=ReadBitmapFileToBuffer(pBitmapPath, pBuffer,fileSize);
    if (!pBuffer) {
        return E_FAIL;
    }

    //2.创建safeArry用于存储二进制数据
    SAFEARRAYBOUND rgsabound;
    rgsabound.lLbound = 0;
    rgsabound.cElements = *fileSize;
    psa = SafeArrayCreate(VT_UI1, 1, &rgsabound);
    if (!psa) {
        if (pBuffer) free(pBuffer);
        if (psa) SafeArrayDestroy(psa);
        return E_FAIL;
    }


    //3.拷贝数据到saveArry
    hr = SafeArrayAccessData(psa, &pData);
    //CHECK_HR(hr, "SafeArrayAccessData failed");
    assert(hr == S_OK);

    memcpy(pData, pBuffer, *fileSize);
    SafeArrayUnaccessData(psa);

    //VARIANT varData;
    VariantInit(&varVal);
    V_VT(&varVal) = VT_ARRAY | VT_UI1;
    V_ARRAY(&varVal) = psa;
    //memcpy(V_ARRAY(&varVal), psa,fileSize);

    if (pBuffer) free(pBuffer);
    //if (psa) SafeArrayDestroy(psa);

    return hr;
}
自定义函数 ReadBitmapFileToBuffer
/*
	从文件中读取位图到数组中
	参数:
		filename	位图文件路径名称
		pBuffer		保存数据的缓存
		fileSize	文件大小
	返回:
		成功返回s_ok,失败为s_flase

*/
HRESULT QAdo::ReadBitmapFileToBuffer(const char* filename,BYTE*& pBuffer, DWORD* fileSize) {

	HANDLE hFile = CreateFileA(filename, GENERIC_READ, 0, nullptr,
		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
	if (hFile == INVALID_HANDLE_VALUE) {
		return S_FALSE;
	}

	*fileSize = GetFileSize(hFile, nullptr);
	pBuffer = (BYTE*)malloc(*fileSize);
	if (!pBuffer)
	{
		CloseHandle(hFile);
		return S_FALSE;
	}


	DWORD bytesRead = 0;
	ReadFile(hFile, pBuffer, *fileSize, &bytesRead, nullptr);
	CloseHandle(hFile);
	return S_OK;

}

  



把VARIANT结构数据写入Access数据库中

QAdo::InitConnString(0, TEXT(".\\test.accdb"));
QAdo ado;
VARIANT varVal;
DWORD lgSize = 0;
ado.ReadBitmapFileToVariant(".\\测试美女位图.bmp",varVal,&lgSize);

TCHAR sql[256] = TEXT("INSERT INTO Images (ID,ImgData) VALUES (@id,@imgdata)");

ado.SetParameter(TEXT("@id"), 13);
ado.SetParameter(TEXT("@imgdata"), varVal, lgSize);

if (ado.Open()) {
	if (ado.CommandExecute(sql) > 0) {
		//保存成功
	}
	ado.Close();
}

 

VARIANT数据类型的参数设置

//VARIANT类型的参数设置,要多传个数组大小
void QAdo::SetParameter(LPCTSTR lpParamName, VARIANT& varVal,long lgSize)
{
	try {
		if (m_pCommand == 0) {
			m_pCommand.CreateInstance(__uuidof(Command));
		}

		m_pCommand->Parameters->Append(m_pCommand->CreateParameter((_bstr_t)lpParamName, adBinary, adParamInput, lgSize, varVal));
	}
	catch (_com_error& e) {
		ShowErrorMsg(TEXT("SetParam参数错误!!!"), e);
	}
}

 

数据库数据图片

image

 

数据库字段[ImgData]用OLE对象保存位图数据

image

 

posted @ 2026-06-11 10:10  初吻给了烟灬  阅读(4)  评论(0)    收藏  举报