如题!
插入如代码段如下:
如果把其字段改为image类型则可正常插入,但用binary类型是插入报错:
在此环境中不允许操作 Unknown error 0x800A0C93
望各位帮个忙!!
        try
{
memcpy(buf,"just a test buffer data",len);
TESTHR(m_connection.CreateInstance(__uuidof(Connection)));
m_connection->ConnectionTimeout = 10;
m_connection->Open(_bstr_t(connstr), "", "", NULL);
TESTHR(m_recordset.CreateInstance(__uuidof(Recordset)));
m_recordset->Open(
"select * from tmptab",
_variant_t((IDispatch*)m_connection,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
m_recordset->AddNew();
if (buf == NULL)
return false;
_variant_t varBlob;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = len;
psa = ::SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i=0; i < len; i++)
::SafeArrayPutElement(psa, &i, buf++);
varBlob.vt = VT_ARRAY | VT_UI1;
varBlob.parray = psa;

TESTHR(m_recordset->GetFields()->GetItem("txt")->AppendChunk(varBlob));
m_recordset->Update();
}
catch(::_com_error& e)
{
printf("error:%s\n%s\n", (const char*)e.Description(), e.ErrorMessage());
if (ptmp != NULL)
delete[] ptmp;
return false;
}

解决方案 »

  1.   

    我现在碰到的问题烦 主要是没弄过 
    我传一个结构体或者数组给存储过程  存储过程把它存到数据库 是binary类型的 这个我搞定了直接改为char*可存可是我提取是用结果集来提取的 我想问用结果集提取binary是怎么弄》?   也是用的SAFEARRAYBOUND 这种方法么?
      

  2.   

    你可以尝试下 以CHAR*的形式存为binary  但是怎么提的 我还没弄过  我难得试了 你存了又提了 成功了 告诉我
    我是用存储过程的
    我的Info.base是一个结构体_ParameterPtr m_pParamBase
    m_pParamBase.CreateInstance(__uuidof(Command));m_pParamBase = m_pCommand->CreateParameter((_bstr_t)param.vInputParam[9],adBinary,adParamInput,param.vInputParamLength[9],(_variant_t)(char*)&Info.base);//给参数设置各属性
    m_pCommand->Parameters->Append(m_pParamBase);//加入到Command对象的参数集属性中
      

  3.   

    你时怎么存binary类型的??结果集的提取可以这样:
    m_command->PutCommandType(adCmdText);
    m_recordset = m_command->Execute(NULL,NULL,adCmdUnknown);
    ...
    while (!m_recordset->EndOfFile)
    {
    DataTypeEnum type = m_recordset->Fields->GetItem("字段")->Type;
    _variant_t varValue = m_recordset->Fields->GetItem("字段")->Value;
    switch(type)
    {
    case adBinary:
    long nsize = m_recordset->Fields->GetItem("字段")->GetActualSize();
    char* sBinary = new char[size];
    char* pTmp = NULL;
    _variant_t varBlob;
    varBlob = varValue;
    ::SafeArrayAccessData(varBlob.parray,(void**)&pTmp);
    for (int j=0; j<nSize; j++)
        sBinary[j] = pTmp[j];
    ::SafeArrayUnaccessData(varBlob.parray);
    sBinary中就是取到的数据了
    ....
    }
    }
      

  4.   

    我存的时候 就是直接转化为char*来存的
    m_pParamBase = m_pCommand->CreateParameter((_bstr_t)param.vInputParam[9],adBinary,adParamInput,param.vInputParamLength[9],(_variant_t)(char*)&Info.base);//给参数设置各属性 
    就是这一个  (_variant_t)(char*)&Info.base   我的Info.base是个结构体 我一把存的 转化为CHAR*再存 然后 adBinary 是这个 就行了可是 如果按结果集提取的那个方法 那代码量就太大了  我是在想 我用 pCommand来存 可以直接转化为 
    (_variant_t)(char*)&Info.base  这样来来存  那我提取binary的时候 应该可以直接转化为char*啊  而不是 通过SafeArrayAccessData来搞一大段的代码
      

  5.   

    char* pBuf = (char*)&pPlayerInfo;
    DWORD m_nFileLen = size;
    VARIANT  varBLOB;
    SAFEARRAY *psa;
    SAFEARRAYBOUND rgsabound[1];  
    if(pBuf)
    {    
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = m_nFileLen;
    psa = SafeArrayCreate(VT_UI1, 1, rgsabound);                      ///创建SAFEARRAY对象
    for (long i = 0; i < (long)m_nFileLen; i++)
    SafeArrayPutElement (psa, &i, pBuf++);                         ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
    varBLOB.vt = VT_ARRAY | VT_UI1;                                   ///将varBLOB的类型设置为BYTE类型的数组
    varBLOB.parray = psa;                                             ///为varBLOB变量赋值
    m_pRecordset->GetFields()->GetItem("Property")->AppendChunk(varBLOB);///加入BLOB类型的数据
    } 这是我原来用的一段用结果集来存的代码 不过我也是存的IMAGE  你看看可不可以存binary  我太郁闷了 我就是想 用 pCommand来把数组和结构体存为binary   然后用结果集来提取把数据 还原到数组和机构体的变量。。
      

  6.   

    这段代码和我的是一样的,存binary时会报错
      

  7.   

    (char*)&Info.base
    你这样存 就是把你的参数转化为char*直接存 绝对能存的进去的
      

  8.   

    我存的就是一个char类型的buffer
      

  9.   

    我用Command来弄的这个是我的代码 我直接就把一个结构体存到数据库里了 数据库里是binary的类型m_pParamBase = m_pCommand->CreateParameter((_bstr_t)param.vInputParam[9],adBinary,adParamInput,param.vInputParamLength[9],(_variant_t)(char*)&Info.base);//给参数设置各属性
      

  10.   

    我用了这个插入就可以了:
    //buf中为要存入的数据
    std::stringstream sstr;
    sstr << "insert into tmptab(txt) values (convert(binary,'" << buf << "'))"; TESTHR(m_connection.CreateInstance(__uuidof(Connection)));
    m_connection->ConnectionTimeout = 10;
    m_connection->Open(_bstr_t(connstr), "", "", NULL);
    TESTHR(m_command.CreateInstance(__uuidof(Command)));
    m_command->ActiveConnection = m_connection;
    m_command->CommandText = sstr.str().c_str();
    m_command->Execute(NULL,NULL,adCmdUnknown);
      

  11.   

    提取呢 有没有更好的方法  你这个也是用的 COMMAND的 恩 效果都一样我一次要提取的估计 有50个字段 都是字节类型的  如果写50段那个提取代码 估计我会疯的
      

  12.   

    怎么可能写50个呢,用do-while循环就行了:
    do
    {
       while(!m_recordset->EndOfFile)
      {
         for(i=0; i<列数; i++)
         {
             varparam = m_recordset-Fields->GetItem((long)i)->Value;//取每列的数据
             //ToDo: 数据处理
          }
         m_recordset->MoveNext();//提取下一行
       }
    }while(m_recordset=m_recordset->NextRecordset((VARIANT*)lngRec));
    //如果有多个结果集的话移到下一个结果集