这个问题被提到过多次了,查查前面的贴子。总体来说,你需要知道appendchunk与getchunk的用法,以及variant类的概念

解决方案 »

  1.   

    关键是使用ADO执行select时碰到blob字段要出错,所以得不到此字段的Field对象。
    可以是一下下面的code:_CommandPtr pCommand;
    _ParameterPtr pParam1; //将要包含BLOB的参数
    CString sQuery; //SQL语句
    _variant_t vRecsAffected(0L);

    _variant_t vNull; //填充用
    vNull.vt = VT_ERROR;
    vNull.scode = DISP_E_PARAMNOTFOUND;
    sQuery.Format("INSERT INTO EMP_PHOTO VALUES ( '%s', 'bitmap', ? )", sEmpNo ); _RecordsetPtr pRs;
    try
    {
    HRESULT hr = pCommand.CreateInstance(__uuidof(Command));
    if(FAILED(hr)) throw("Unable to create Command object");

    //得到command对象
    pCommand->PutRefActiveConnection(m_pConnection); //开始查询
    pCommand->PutCommandText((LPCTSTR) sQuery);

    //说明是sql语句查询
    pCommand->PutCommandType(adCmdText); //初始化parameter对象
    hr = pParam1.CreateInstance(__uuidof(Parameter));
    if (FAILED(hr)) throw ("Unable to create Parameter object"); //制造blob参数
    pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); //将此参数加入command的参数集合
    hr = pCommand->Parameters->Append(pParam1);
    if (FAILED(hr)) throw ("Unable to append Parameter to Command Object");
    hr = pCommand->Execute(&vRecsAffected, &vNull, adCmdText);
    if (FAILED(hr)) throw ("Failed to insert BLOB into Database");
    }
    catch(_com_error &e)
    {
    DisplayError(e);
    return 0;
    }

    表结构为:id number(3),
    imeage_type varchar2(20),
    image blob.
      

  2.   

    还望大伙踊跃发言, 我是利用#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
    方法使用ADO的, 跟上面的有些不同,
    这一句能否解释一下,谢谢
    pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB);
      

  3.   

    上述的程序也是用#import的。
    你看到
    sQuery.Format("INSERT INTO EMP_PHOTO VALUES ( '%s', 'bitmap', ? )", sEmpNo );
    中间的"?"了吗?那个就是为pParem1所准备的!
    所以使用
    pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 来创建一个指向blob的参数,来填补上面的"?"
        
      

  4.   

    我的语法和你的看上去不太一样啊!
    以下是我封装的简单的类(不处理BLOB)!(暂时没处理异常)// CGCallDB.h : interface of the CGCallDB class
    //
    /////////////////////////////////////////////////////////////////////////////#if !defined(AFX_CGCallDB_H__INCLUDED_)
    #define AFX_CGCallDB_H__INCLUDED_#if _MSC_VER >= 1000
    #pragma once
    #endif // _MSC_VER >= 1000
    class CCGCallDB : public CObject
    {
    DECLARE_DYNCREATE(CCGCallDB);public:
    CCGCallDB();
    virtual ~CCGCallDB();public:
        _RecordsetPtr m_pAdoRecordset;
        _CommandPtr m_pAdoCommand;
        _ParameterPtr m_pAdoParameter;
        void SqlExec(CString szSql);
        void SqlExecEnd();
        void SqlOpen(CString szSql);
        void SqlOpenEnd(); 
    };
    #endif ********************************************************************// CGCallDB.cpp : implementation of the CCGCallDB class
    //#include "stdafx.h"
    #include "CGCallDB.h"
    #include "CoGraph.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifIMPLEMENT_DYNCREATE(CCGCallDB, CObject)CCGCallDB::CCGCallDB()
    {
        m_pAdoRecordset = NULL;
        m_pAdoCommand.CreateInstance("ADODB.Command");
        m_pAdoCommand->ActiveConnection = ((CCoGraphApp*)AfxGetApp())->m_pAdoConnection;  //从外部传入的
            
    }CCGCallDB::~CCGCallDB()
    {
        m_pAdoCommand = NULL;
        m_pAdoRecordset = NULL;
    }void CCGCallDB::SqlExec(CString szSql)
    {
        _variant_t vNULL;
        vNULL.vt = VT_ERROR;
        vNULL.scode = DISP_E_PARAMNOTFOUND;//定义为无参数
        m_pAdoCommand->CommandText = (_bstr_t)szSql;
        m_pAdoCommand->Execute(&vNULL, &vNULL, adCmdText);
    }void CCGCallDB::SqlExecEnd()
    {
         
    }void CCGCallDB::SqlOpen(CString szSql)
    {
        _variant_t vNULL;
        vNULL.vt = VT_ERROR;
        vNULL.scode = DISP_E_PARAMNOTFOUND;//定义为无参数
        m_pAdoCommand->CommandText = (_bstr_t)szSql;
        m_pAdoRecordset = m_pAdoCommand->Execute(&vNULL, &vNULL, adCmdText);//执行命令,返回记录集
    }void CCGCallDB::SqlOpenEnd()
    {
        m_pAdoRecordset->Close();
        m_pAdoRecordset = NULL;   
    }
    pParam1 = pCommand->CreateParameter((LPCTSTR) "picture", adBinary, adParamInput, vBLOB.parray->rgsabound[0].cElements, vBLOB); 来创建一个指向blob的参数,来填补上面的"?"vBLOB.parray->rgsabound[0].cElements, vBLOB都是写什么啊!
    还有,内存里的BLOB变量怎么建啊, 我怎么把IMAGE上的图片写到这个内存变量里,
    用什么数据类型啊!
      

  5.   

    比如说我的某一个控件有这样一个方法可以调用:
    CMyCtr::WriteToBlob(long* phBlob, long lReservedBytes)
    我应该如何定义这个BLOB变量,并写到数据库里.
    CLongBinary能用吗?