_RecordsetPtr MySet;
MySet.CreateInstance(__uuidof(Recordset));
SOpen.Format("SELECT * FROM test_data ");
MySet->Open(_bstr_t(SOpen),_variant_t((IDispatch*)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
MySet->AddNew(); ///添加新记录
if(buffer)//要保存的数据都在buffer[]里
{
try
{   rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 12020;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
for (long i = 0; i < 12020; i++)
SafeArrayPutElement (psa, &i, buffer++); ///将buffer指向的二进制数据保存到SAFEARRAY对象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa; ///为varBLOB变量赋值
HRESULT   hr; 
hr=MySet->Fields->GetItem("data")->AppendChunk(varBLOB);///加入BLOB类型的数据
if(SUCCEEDED(hr)) 
AfxMessageBox("ok");
}
catch(_com_error   &e) 

dump_com_error(e); 
return   FALSE; 


}
MySet->PutCollect("file_name",_variant_t(record.FileName));
MySet->PutCollect("test_date",_variant_t(record.Date));
MySet->PutCollect("switch_id",_variant_t(Switch_ID));
MySet->PutCollect("test_type",_variant_t(record.Type));
MySet->PutCollect("time",_variant_t(record.Time));
MySet->Update(); //到这行就出错了
MySet->Close();///关闭记录集

}以上是代码,运行到倒数第二行MySet->Update();就会出错,跳出来说是未知错误,我要保存的是12020个二进制数,MySQL数据库中用的字段类型blob,mediumblob都试过了,都不行,我以前是用access的OLE对象倒是可以的,如果把保存二进制的那段代码注释起来,只存最后几行的字段都是可以的。请问到底错在哪里?

解决方案 »

  1.   

    先不加这个BLOB字段试一下UPDATE,以确保你的ADO驱动没有问题。
      

  2.   

    "如果把保存二进制的那段代码注释起来,只存最后几行的字段都是可以的。",这说明ADO引擎没问题。你在你自己的MYSQL服务器上用SQL语句加一个BLOB类型的大数据试试。
      

  3.   


    12020个二进制数,按道理,没有超过BLOB的长度限制:(L< 2^16 = 65546B = 64KB)
    long型可能是4字节,也可能是8字节,跟你机器是32位还是64位有关系。你把buffer的大小打出来看看,是否超长?换用LONGBLOB字段类型试试。
      

  4.   

    试过的应该不是长度的问题,我看网上有人跟我这个情况一样,好像AppendChunk在mySQL存blob就是这样~有没有其它方法存blob啊???
      

  5.   

    既然不是长度的问题,那你把那个array换短点,测试一下。如果还有问题,那就是代码本身的问题。发一段完整的代码看看吧
      

  6.   

    终于解决了,
    MySQL5.1参考手册
    26.1.12.2. 无论何时,当我使用AppendChunk()或GetChunk() ADO方法时,遇到错误“多步操作导致错误,请检查每个状态值”
    将光标位置指定为adUseServer时,ADO的GetChunk()和AppendChunk()方法不能按预期的方式工作。从另一方面上讲,可使用adUseClient克服该问题。原来答案就一直在离我咫尺的地方,我却找了那么久,众里寻它千百度,蓦然回首唉,要好好反省