我用的mysqlodbc,代码如下,其中di.m_img和di.m_texture是二进制数据,不知道对你有没有帮助。
// 存入数据库
CString sqlstr = _T("where false");
Cdaimgdetail di;
di.Open2(sqlstr);
di.AddNew(); CString diid = _T("DI_") + getguid();
di.m_ID = diid;
di.m_SDID = sdid;
di.m_scantime = m_timg.scanday;
di.m_scanpos.Format( L"%d", m_timg.pos ); di.m_img.SetSize( encodelen );
LPBYTE p = di.m_img.GetData(); // 取目的指针
memcpy( p, buffer, encodelen );
di.SetFieldDirty( &di.m_img );       
di.SetFieldNull( &di.m_img, FALSE );
delete buffer; // 建立头
BYTE * head = new BYTE[0x10000]; //?? 申请一个较大的空间。
m_timg.inithead( head );
// 用实际高度
((imginfo *)head)->imgh = imgheight; int n = ((imginfo *)head)->size;
di.m_texture.SetSize( n );
memcpy( di.m_texture.GetData(), head, n);
delete head;
head = 0;
di.SetFieldDirty( &di.m_texture );       
di.SetFieldNull( &di.m_texture, FALSE );  di.Update();
di.Close();

解决方案 »

  1.   

    你这个是给ADO自己封装一个类吗,如果是这样,内部操作是什么,跟这我帖的代码一样吗?如果内部操作ADO过程一样,那是mysqlodbc驱动版本有问题还是什么?!
      

  2.   

    你看一下varBLOB这个变量里有没有数据,别是这个变量没有传进数据,只传个地址
      

  3.   

    没有人回答啦,这个问题大家很少遇到吗?ADO大家用的不多吗?
      

  4.   

    现在有最新的mysqlodbc驱动是3.51,换成这个版本试试,我试过3.50也是不支持二进制字段.
      

  5.   

    ADO二进制写入操作只有我贴子给的这一种使用方法吗?
      

  6.   

    问题解决啦,程序代码没有问题;是myodbc 5.1.5这个驱动程序的问题,更新到最新的版本MySQL ODBC 5.02.06后,一切正常
      

  7.   

    再补充说明一下,myodbc 5.1.5这个驱动程序其实没有问题,myodbc 5.1.5 驱动在打开ado对象游标时设置成adUseClient类型才能使用Blob,如果不显式的设置游标类型为adUseClient,没默认为adUseServer 类型,此时是不支持使用Blob的。
    但是更新myodbc 驱动到myodbc 5.02.06后,不进行显式的adUseClient类型设置也能进行Blob类型操作,此种情况尚不太清楚什么原理;
    符上操作代码:
    BOOL CAdoDBMgr::InitDBConnect(LPCTSTR lpIP,
      LPCTSTR lpDBName/* = _T("")*/,
      LPCTSTR lpUsrID/* = _T("")*/,
      LPCTSTR lpPWD/* = _T("")*/)
    {
    BOOL bResult = TRUE;
    try
    {
    m_pConnection.CreateInstance(__uuidof(Connection));///创建Connection对象//"ADODB.Connection"
    if (!m_pConnection)
    {
    bResult = FALSE;
    m_nErrNum = GetLastError();
    m_strErrInfo = _T("创建数据库连接对象失败!\n ");
    return FALSE;
    } CString strSQL;
                    // 使用5.1驱动
    strSQL.Format(_T("DRIVER={MySQL ODBC 5.1 Driver};")
    _T("SERVER=%s;DATABASE=%s;USER=%s;")
    _T("PASSWORD=%s;OPTION=3;")
    , lpIP, lpDBName, lpUsrID, lpPWD);
    //             // 使用5.2.6驱动(Unicode & ANSI )
    //  strSQL.Format(_T("DRIVER={MySQL ODBC 5.2 Unicode Driver};")
    //  _T("SERVER=%s;DATABASE=%s;USER=%s;")
    //  _T("PASSWORD=%s;OPTION=3;")
    //  , lpIP, lpDBName, lpUsrID, lpPWD);
    //  strSQL.Format(_T("DRIVER={MySQL ODBC 5.2 ANSI Driver};")
    //  _T("SERVER=%s;DATABASE=%s;USER=%s;")
    //  _T("PASSWORD=%s;OPTION=3;")
    //  , lpIP, lpDBName, lpUsrID, lpPWD); m_pConnection->Open(_bstr_t(strSQL),"","",adModeUnknown);///连接数据库
    // 加此一句
    //  对mysql来说,如果不用此cursor adUseClient,会导致在更新blob时不成功
    //  但也不报错 确实是 adUseServer
    //int aaa = m_pConnection->GetCursorLocation();
    m_pConnection->PutCursorLocation(adUseClient);
    //aaa = m_pConnection->GetCursorLocation(); bResult = TRUE;
    }// try
    catch(_com_error e)
    {
    bResult = FALSE;
    m_nErrNum = GetLastError();
    m_strErrNum = e.ErrorMessage();
    m_strErrInfo = (LPCTSTR)(BSTR)e.Description();
    } return bResult;
    }