VC中的数据库存储二进制文件

/*
  测试插入流文件
*/
void insert_()
{
    _StreamPtr    pwStream;    
    _bstr_t        strPath("D:\\my\\21.wav");
    _bstr_t        strOpen("");
 
    _variant_t    varBLOB;
    _variant_t    varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR); 
 
    HRESULT hr = pwStream.CreateInstance(_uuidof(Stream));        //创建流对象
    if(SUCCEEDED(hr))
    {
        pwStream->Type = adTypeBinary;
        hr = pwStream->Open(varOptional, adModeUnknown, adOpenStreamUnspecified, strOpen, strOpen);            //打开流
    }
 
    strSql = "select * from t_mov1 where 1 = 0";
    m_pRecordset->Open(strSql,  _variant_t((IDispatch*)m_pConnection,true),
                adOpenDynamic, adLockOptimistic, adCmdText);
    if(SUCCEEDED(hr))
    {
        pwStream->LoadFromFile(strPath);        //读取文件
        m_pRecordset->AddNew(vtMissing, vtMissing);
        m_pRecordset->PutCollect("id", (long)id);
        m_pRecordset->PutCollect("b_flow", pwStream->Read(adReadAll));    //将数据写入数据库
        m_pRecordset->Update();
        pwStream->Close();
    }
}
/*
    从数据库中读出流数据
*/
void read(int id)
{
    char    *m_pBuffer;
    _StreamPtr    prStream;
    _bstr_t        strOpen("");
    _variant_t  varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    HRESULT        hr;
 
    hr = prStream.CreateInstance(_uuidof(Stream));            //创建流
    if(SUCCEEDED(hr))
    {
        prStream->Type = adTypeBinary;
        hr = prStream->Open(varOptional, adModeUnknown, adOpenStreamUnspecified, strOpen, strOpen);        //打开流
    }
 
    CString strSql;
    strSql.Format("select * from t_mov1 where id = %d", id);
 
    m_pRecordset->Open((_bstr_t)strSql, _variant_t((IDispatch*)m_pConnection,true),
                adOpenDynamic, adLockOptimistic, adCmdText);
 
    if(SUCCEEDED(hr))
    {
        prStream->Write(m_pRecordset->Fields->GetItem("b_flow")->GetValue());
         
        long lDataSize;
        lDataSize = prStream->GetSize();    
 
        _variant_t  varBLOB;
         
        //流指针指向首位
        prStream->put_Position(0);
        //varBLOB.vt = VT_ARRAY | VT_UI1;
        //varBLOB.scode = DISP_E_PARAMNOTFOUND;
        varBLOB = prStream->Read(adReadAll);
             
        if(varBLOB.vt == (VT_ARRAY | VT_UI1))
        {    
            //分配必要的存储空间
            if(m_pBuffer = new char[lDataSize+1])                
            {    
                char *pBuf = NULL;
                 
                //复制数据到缓冲区m_pBuffer
                SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);                
                memcpy(m_pBuffer, pBuf, lDataSize);            
                SafeArrayUnaccessData (varBLOB.parray);                
            }
        }
 
        prStream->SaveToFile("d:\\1.wav", adSaveCreateOverWrite);
        prStream->Close();
    }
}
posted @ 2013-09-12 16:43  ★末日3000  阅读(339)  评论(0)    收藏  举报