注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
在 Visual Studio .NET 中使用 S
用VC程序来创建SQL Server ODBC数
系统档案:亦真亦假的Svchost.ex
在Vista中禁用讨厌的UAP功能
在Linux中制作VCD
合并VCD片断、快速删除文件夹--D
vc++中调用ADO的常用方法
GTK+开发环境在win32&VC
分析MFC中的映射
VC6.0中使用Stream Object读取数
您现在的位置: 顶尖设计 >> IT学院 >> 数据库 >> MS SQL >> 文章正文
在VC中用OLE DB读写SQL Server中的BLOB字段
作者:佚名  来源:不详  点击:  更新:2006-12-20
简介:
    本人曾遇到一个非常棘手的问题,在VC中用OLE DB读写SQL Server中的BLOB字段时,尝试了几乎所有的绑定方法,读是没有问题,但总无法成功地将数据写入BLOB中的字段中。后来在SQL Server的Books OnLines中找到一些提示,经多次实验,终于成功地解决问题。在这里提供源代码供大家参考。

首先,应当从ISequentialStream派生一个类,其头文件如下(SeqStream.h):

//SeqStream.h

#if !defined (CSEQSTREAM_H)

#define CSEQSTREAM_H

 

class CSeqStream : public ISequentialStream

{

public:

    //Constructors

    CSeqStream();

    virtual ~CSeqStream();

 

    virtual BOOL Seek(ULONG iPos);

    virtual BOOL Clear();

    virtual BOOL CompareData(void* pBuffer);

    virtual ULONG Length()  { return m_cBufSize; };

    virtual operator void* const() { return m_pBuffer; };

 

    STDMETHODIMP_(ULONG)    AddRef(void);

    STDMETHODIMP_(ULONG)    Release(void);

    STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);

    STDMETHODIMP Read(

            /* [out] */ void __RPC_FAR *pv,

            /* [in]  */ ULONG cb,

            /* [out] */ ULONG __RPC_FAR *pcbRead);

    STDMETHODIMP Write(

            /* [in] */ const void __RPC_FAR *pv,

            /* [in] */ ULONG cb,

            /* [out]*/ ULONG __RPC_FAR *pcbWritten);

        void ResetPosition();

protected:

 

    //Data

private:

    ULONG       m_cRef;         // reference count

    void*       m_pBuffer;      // buffer

    ULONG       m_cBufSize;     // buffer size

    ULONG       m_iPos;         // current index position in the buffer

 

};

 

#endif

 

实现文件如下(SeqStream.cpp):

#include "stdafx.h"

#include "SeqStream.h "

 

CSeqStream::CSeqStream()

{

    m_iPos         = 0;

    m_cRef         = 0;

    m_pBuffer      = NULL;

    m_cBufSize     = 0;

    //The constructor AddRef's

    AddRef();

}

 

CSeqStream::~CSeqStream()

{

    //Shouldn't have any references left

//    ASSERT(m_cRef == 0);

    CoTaskMemFree(m_pBuffer);

}

 

ULONG    CSeqStream::AddRef(void)

{

    return ++m_cRef;

}

 

ULONG    CSeqStream::Release(void)

{

//    ASSERT(m_cRef);

    if(--m_cRef)

        return m_cRef;

    delete this;

    return 0;

}

 

HRESULT CSeqStream::QueryInterface(REFIID riid, void** ppv)

{

//    ASSERT(ppv);

    *ppv = NULL;

 

    if (riid == IID_IUnknown)

        *ppv = this;

    if (riid == IID_ISequentialStream)

        *ppv = this;

 

    if(*ppv)

    {

        ((IUnknown*)*ppv)->AddRef();

        return S_OK;

    }

 

    return E_NOINTERFACE;

}

 

BOOL CSeqStream::Seek(ULONG iPos)

{

    //Make sure the desired position is within the buffer

 

//    ASSERT(iPos == 0 || iPos < m_cBufSize);

 

    //Reset the current buffer position

    m_iPos = iPos;

&nbs

[1] [2] [3] [4] 下一页




  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务