• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 使用ISequentialStream向数据库插入和修改数据时出错

使用ISequentialStream向数据库插入和修改数据时出错

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了大数据使用的数据库,使用数据库管理数据,数据库数据类型,数据库中的数据类型,数据库插入数据等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 使用ISequentialStream向数据库插入和修改数据时出错
描述:

LRESULT CDlg::OnBnClickedRead(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// TODO: 在此添加控件通知处理程序代码
CISSHelper css;//接口类,继承了ISequentialStream
char* fn = "f:\\first.jpeg";
HRESULT hr;
CBB rs;//数据库的数据格式,本人是用ATL中的OLEDB使用者向导打开的.
BYTE m_blob[8000];//文件在内存中形式
size_t len;
//打开数据库
hr = rs.OpenAll();
hr = rs.MoveFirst();
if(FAILED(hr))
{
ATLTRACE("MoveFirst Failed!\n");
}
//读文件
FILE* file;
file = fopen( fn, "rb");
len = fread( m_blob, sizeof(BYTE), 8000, file);
m_blob[ len + 1] = '\0';
fclose( file);
         
         //向ISequentialStream接口继承类写数据
hr = css.Write( m_blob, len, NULL);
rs.m_BLOB = (ISequentialStream*)&css;
rs.m_dwBLOBStatus = DBSTATUS_S_OK;
rs.m_dwBLOBLength = css.m_ulLength;
//>>-------------------------------------------------------------->>
         // 向数据库插入数据
hr = rs.Insert();// 返回值hr= E_UNEXPECTED
         //此处报错. 请高手给看看.
//<<--------------------------------------------------------------<<
if(FAILED(hr))
{
ATLTRACE("SaveToDb Failed!\n");
}
//关闭数据库
rs.CloseAll();
return 0;
}
class CISSHelper : public ISequentialStream  
{
public:
// Constructor/destructor.
CISSHelper();
virtual ~CISSHelper();
// Helper function to clean up memory.
virtual void Clear();
// ISequentialStream interface implementation.
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);
public:
void*       m_pBuffer; // Buffer
ULONG       m_ulLength;     // Total buffer size.
ULONG       m_ulStatus;     // Column status.
private:
ULONG m_cRef; // Reference count (not used).
ULONG       m_iReadPos;     // Current index position for reading from the buffer.
ULONG       m_iWritePos;    // Current index position for writing to the buffer.
};
CISSHelper::CISSHelper()
{
m_cRef = 0;
m_pBuffer = NULL;
m_ulLength = 0;
m_ulStatus  = DBSTATUS_S_OK;
m_iReadPos = 0;
m_iWritePos = 0;
}
CISSHelper::~CISSHelper()
{
Clear();
}
void CISSHelper::Clear() 
{
CoTaskMemFree( m_pBuffer );
m_cRef = 0;
m_pBuffer = NULL;
m_ulLength = 0;
m_ulStatus  = DBSTATUS_S_OK;
m_iReadPos = 0;
m_iWritePos = 0;
}
ULONG CISSHelper::AddRef(void)
{
return ++m_cRef;
}
ULONG CISSHelper::Release(void)
{
return --m_cRef;
}
HRESULT CISSHelper::QueryInterface( REFIID riid, void** 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;
}
HRESULT CISSHelper::Read( void *pv, ULONG cb, ULONG* pcbRead )
{
// Check parameters.
if ( pcbRead ) *pcbRead = 0;
if ( !pv ) return STG_E_INVALIDPOINTER;
if ( 0 == cb ) return S_OK; 
// Calculate bytes left and bytes to read.
ULONG cBytesLeft = m_ulLength - m_iReadPos;
ULONG cBytesRead = cb > cBytesLeft ? cBytesLeft : cb;
// If no more bytes to retrive return S_FALSE.
if ( 0 == cBytesLeft ) return S_FALSE;
// Copy to users buffer the number of bytes requested or remaining
memcpy( pv, (void*)((BYTE*)m_pBuffer + m_iReadPos), cBytesRead );
m_iReadPos += cBytesRead;
// Return bytes read to caller.
if ( pcbRead ) *pcbRead = cBytesRead;
if ( cb != cBytesRead ) return S_FALSE; 
return S_OK;
}
        
HRESULT CISSHelper::Write( const void *pv, ULONG cb, ULONG* pcbWritten )
{
// Check parameters.
if ( !pv ) return STG_E_INVALIDPOINTER;
if ( pcbWritten ) *pcbWritten = 0;
if ( 0 == cb ) return S_OK;
// Enlarge the current buffer.
m_ulLength += cb;
// Grow internal buffer to new size.
//m_pBuffer = CoTaskMemRealloc( m_pBuffer, m_ulLength );
m_pBuffer = CoTaskMemAlloc ( m_ulLength );
// Check for out of memory situation.
if ( NULL == m_pBuffer ) 
{
Clear();
return E_OUTOFMEMORY;
}
// Copy callers memory to in

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 使用ISequentialStream向数据库插入和修改数据时出错

相关文章

  • 2017-06-04 谁用过世纪飞扬仪表控件
  • 2017-06-05 能不能将DLL编译进入EXE文件啊?
  • 2017-06-05 创建一个线程后,怎样结束线程
  • 2017-06-04 请问使用WindowsMediaPlayer这个ACTIVEX控件播放时,如何全屏播放,欢迎高手出招!
  • 2017-06-05 请教一下:系统中最多可以创建多少个Event对象
  • 2017-06-04 为什么Queryinterface返回的IUnknown指针总是相同的
  • 2017-06-05 关于VB调用VC动态库出现的问题
  • 2017-06-05 多线程之间如何调用COM组件
  • 2017-06-04 关于线程之间组件接口传递的问题
  • 2017-06-04 ATL控件高手进,高分相送!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 急问关于使用activex控件问题
    • 请问在DLL里放2个类是否可以?谢谢!
    • 在用ActiveX调用DLL,嵌入IE,在ActiveX释放的时候为什么不能对dll做FreeLibrary
    • 初次接触,望提醒
    • 无法定位动态连接库的问题
    • 如何获得所有进程的完整路径?
    • 关于一个CSingleLock的Islocked函数代码的问题
    • 判断目前操作系统版本的变量_WIN32_WINNT的值应被定义为多少是WINDOWXP
    • 线程内部循环延时问题,为什么是16毫秒,有办法减少吗?
    • 初学com,疑惑多多,都是基础问题请大家不吝赐教!100分酬谢

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有