如何读写binary字段?

解决方案 »

  1.   

    可以参照:http://expert.csdn.net/Expert/topic/1512/1512389.xml?temp=.8389856转发我以前的回答这属于BLOB对象的插入,我使用的是用OLEDB的方法插入,很简单,在我的表中有2个字段,其中一个是文件名,另外一个是图片(image )。代码如下,代码可以用VC 的 ALT Wizard 生成,稍微做了些修改。第一步,首先生成绑定类,// TestPic.H : Declaration of the CTestPic class#ifndef __TESTPIC_H_
    #define __TESTPIC_H_
    class CTestPicAccessor
    {
    public:
    LONG m_imgId;
    TCHAR m_FileName[41];
    ULONG m_FileNameSta;
    ULONG m_FileNameLen;
    ULONG m_PictureSta;
    ULONG m_PictureLen;
    ISequentialStream* m_Picture;BEGIN_COLUMN_MAP(CTestPicAccessor)
    // COLUMN_ENTRY(1, m_imgId)
    COLUMN_ENTRY_LENGTH_STATUS(1, m_FileName,m_FileNameLen,m_FileNameSta)
    BLOB_ENTRY_LENGTH_STATUS(2, IID_ISequentialStream, STGM_READ, m_Picture,m_PictureLen,m_PictureSta)
    END_COLUMN_MAP()DEFINE_COMMAND(CTestPicAccessor, _T(" \
    SELECT \
    FileName, \
    Picture \
    FROM dbo.TestPic")) // You may wish to call this function if you are inserting a record and wish to
    // initialize all the fields, if you are not going to explicitly set all of them.
    void ClearRecord()
    {
    memset(this, 0, sizeof(*this));
    }
    };class CTestPic : public CCommand<CAccessor<CTestPicAccessor> >
    {
    public:
    HRESULT Open()
    {
    HRESULT hr; hr = OpenDataSource();
    if (FAILED(hr))
    return hr; return OpenRowset();
    }
    HRESULT OpenDataSource()
    {
    HRESULT hr;
    CDataSource db;
    CDBPropSet dbinit(DBPROPSET_DBINIT); dbinit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR("sqlpassword"));
    dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("sa"));
    dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("QSPDA"));
    dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("MyServer"));
    dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052);
    dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
    hr = db.Open(_T("SQLOLEDB.1"), &dbinit);
    if (FAILED(hr))
    return hr; return m_session.Open(db);
    }
    HRESULT OpenRowset()
    {
    // Set properties for open
    CDBPropSet propset(DBPROPSET_ROWSET);
    propset.AddProperty(DBPROP_IRowsetChange, true); 
    propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
    // propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);

    ClearRecord();
    return CCommand<CAccessor<CTestPicAccessor> >::Open(m_session, NULL, &propset);
    }
    CSession m_session;
    };#endif // __TESTPIC_H_第二步:下边的例子演示了如何使用这个绑定类void CInsertPhotoDlg::OnButton1() 
    {
    CTestPic pic;

    HRESULT hr = pic.Open(); CFile     file;
    CFileFind find;
    BOOL bFind = find.FindFile("E:\\mosell\\MobileSales\\DOC\\TestPhoho\\*.jpg");
    CString strFileName;
    while(bFind)
    {
    bFind = find.FindNextFile();
    // hr = pic.MoveFirst(); if(file.Open(find.GetFilePath(),CFile::modeRead)==TRUE)
    {
    UINT nBuffLen = file.GetLength();
    ULONG nWritten;
    CSeqStream *pPicStream = new CSeqStream;
    BYTE *pBuff =  (BYTE*)pPicStream->AllocBuff(nBuffLen);
    UINT uCount = file.Read(pBuff,nBuffLen);
    ASSERT(uCount == nBuffLen);

    strFileName = find.GetFileName();
    lstrcpyn(pic.m_FileName,find.GetFileName(),41);
    pic.m_FileNameSta = DBSTATUS_S_OK;
    pic.m_FileNameLen = strFileName.GetLength();

    pic.m_Picture     = pPicStream;
    pic.m_PictureSta  = DBSTATUS_S_OK;
    pic.m_PictureLen  = nWritten;

    hr  = pic.Insert(); ASSERT(nBuffLen == uCount); file.Close();
    }
    }
    find.Close();}这个方法是我加上去的。CSeqStream 类你可以在MSND的代码示例中找到,我就不浪费空间了。
    void* CSeqStream::AllocBuff(ULONG cbSize)
    {
    Clear();
    m_cBufSize = cbSize;
    m_pBuffer = CoTaskMemAlloc(m_cBufSize);
    memset(m_pBuffer,0,m_cBufSize);
    return m_pBuffer;
    }