我想用一个imag类型字段保存一串点坐标。
   点坐标存在 Vector中。
   请哪位大侠帮我写个例子 如何用AppendChunk()将一个Vecotr的数据存入imag类型字段中
,然后将imag类型字段中的数据用GetChunk()取到一个 Vector中。
   感激不尽 高分敬上!

解决方案 »

  1.   

    http://support.microsoft.com/kb/189415/zh-cn
      

  2.   

    vector 是容器,
    你如果只是存储容器中的元素,那么不用image字段更方便如果你要存储vector指向的数据缓存。似乎会把问题复杂了。
    虽然vector元素是连续存储的,但要考虑从image字段读取这段二进制流,问题是你不能简单的直接转换为vector,因为这个流的元素个数,大小,类型信息都丢失了。
      

  3.   

    我是存 vector中的元素啊 但我的vector长度不定 而且要求把里面的数据都存到一个字段里 有什么不用image的更好的方法么 请大侠指教啊
      

  4.   

    vector存入数据库的时候,每个元素之间加一个分隔符| 等,然后读取的时候,自己读取出来,然后再根据|取出数据放入vector
      

  5.   

    给你两个函数代表自己看下就知道了。
    bool COracleConnectDlg::ExeSqlFuction(CString sSql)
    {
    char contents[300];
    int iVal;
    float fVal;
    double dfVal;
    CString sVal;
    try
    {
    m_SqlRs = m_SqlConn->Execute((_bstr_t)sSql, &m_SqlVar, adCmdText);
    if(!m_SqlRs->ADOEOF&&!m_SqlRs->BOF)
    {
    while(!m_SqlRs->ADOEOF&&!m_SqlRs->BOF)
    {
    /*
    m_SqlVar = m_SqlRs->GetCollect(_variant_t("A"));
    strcpy(contents,(char*)_bstr_t(m_SqlVar));
     iVal = m_SqlVar.intVal;
    m_SqlVar = m_SqlRs->GetCollect(_variant_t("B"));
    iVal = m_SqlVar.intVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("C"));
    iVal = m_SqlVar.intVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("D"));
    iVal = m_SqlVar.intVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("E"));
    sVal = m_SqlVar.bstrVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("F"));
    sVal.Format("%s",m_SqlVar.bstrVal);
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("G"));
    iVal = m_SqlVar.lVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("H"));
    fVal =m_SqlVar.fltVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar));

    m_SqlVar = m_SqlRs->GetCollect(_variant_t("K"));
    dfVal = m_SqlVar.dblVal;
    strcpy(contents,(char*)_bstr_t(m_SqlVar)); m_SqlVar = m_SqlRs->GetCollect(_variant_t("M"));
    strcpy(contents,(char*)_bstr_t(m_SqlVar));
    */
    /*二进制流形式*/
    //m_SqlVar = m_SqlRs->GetCollect(_variant_t("N"));
    //strcpy(contents,(char*)_bstr_t(m_SqlVar));
    _variant_t var;
    int iLen ;
    iLen = m_SqlRs->GetFields()->GetItem("N")->ActualSize;
    var = m_SqlRs->GetFields()->GetItem("N")->GetChunk(iLen);
    if(var.vt==(VT_ARRAY|VT_UI1))
    {
    char *pBuf = NULL;
    SafeArrayAccessData(var.parray,(void**)&pBuf);
    SafeArrayUnaccessData(var.parray);
    }
    ::VariantClear(&var);
    m_SqlRs->MoveNext(); }

    }
    if(m_SqlRs->State)
    m_SqlRs->Close();
    return true; }
    catch(...)
    {
    return false;
    }
    return false;
    }void COracleConnectDlg::TestSql()
    {
    m_sSqlExe.Format("select * from AT");
    ExeSqlFuction(m_sSqlExe);
    Write_Blob();
    }
    bool COracleConnectDlg::Write_Blob()
    {
    COleVariant var ;
    SAFEARRAY *pSfe ;
    SAFEARRAYBOUND pRg;
    char *pBuf = new char[10];
    memset(&pBuf[0],0x00,10);
    oraType pData;
    memset(&pData,0x00,sizeof(oraType));
    pData.a = 12345678901;
    pData.b = true;
    pData.c = 0xffff;
    pData.d = 1234567890;
    CString sData;
    sData.Format("可变类型navarchar");
    memcpy(&pData.e[0],sData,sData.GetLength());
    sData.Format("可变类型varchar");
    memcpy(&pData.f[0],sData,sData.GetLength());
    pData.g = 1;
    pData.h = 0.12345;
    pData.k = 123456789.1234;
    sData.Format("11-12月-09");
    memcpy(&pData.M[0],sData,sData.GetLength()); pRg.lLbound = 0;
    pRg.cElements =10;
    pSfe=SafeArrayCreate(VT_UI1,1,&pRg);
    var.vt = VT_ARRAY|VT_UI1;
    var.parray = pSfe;
    for(long i=0;i<10;i++)
    {
    pBuf[i] = i+0x30;
    SafeArrayPutElement(pSfe,&i,&pBuf[i]);
    }

    try
    {
    CString sSql;
    sSql.Format("select * from AT");
    //m_SqlRs = m_SqlConn->Execute((_bstr_t)sSql, &m_SqlVar, adCmdText);
    m_SqlRs->Open((_variant_t)sSql,_variant_t((IDispatch *)m_SqlConn),adOpenDynamic,adLockOptimistic,adCmdUnknown);


    m_SqlConn->BeginTrans();
    if(m_SqlRs->ADOEOF||m_SqlRs->BOF)
    {
    m_SqlRs->AddNew();
    m_SqlRs->PutCollect("A",_variant_t(pData.a));
    m_SqlRs->PutCollect("B",_variant_t(pData.b));
    m_SqlRs->PutCollect("C",_variant_t((long)pData.c));
    m_SqlRs->PutCollect("D",_variant_t((long)pData.d));
    m_SqlRs->PutCollect("E",_bstr_t(pData.e));
    m_SqlRs->PutCollect("F",_bstr_t(pData.f));
    m_SqlRs->PutCollect("G",_variant_t(pData.g));
    m_SqlRs->PutCollect("H",_variant_t(pData.h));
    m_SqlRs->PutCollect("K",_variant_t(pData.k));
    sData.Format("11-12月-09");
    m_SqlRs->PutCollect("M",LPCTSTR(sData));
    m_SqlRs->GetFields()->GetItem("N")->AppendChunk(var);
    m_SqlRs->Update();
    m_SqlRs->Close();
    }
    else
    {
    m_SqlRs->Delete(adAffectCurrent);
    m_SqlRs->AddNew();
    m_SqlRs->PutCollect("A",_variant_t(pData.a));
    m_SqlRs->PutCollect("B",_variant_t(pData.b));
    m_SqlRs->PutCollect("C",_variant_t((long)pData.c));
    m_SqlRs->PutCollect("D",_variant_t((long)pData.d));
    m_SqlRs->PutCollect("E",_bstr_t(pData.e));
    m_SqlRs->PutCollect("F",_bstr_t(pData.f));
    m_SqlRs->PutCollect("G",_variant_t(pData.g));
    m_SqlRs->PutCollect("H",_variant_t(pData.h));
    m_SqlRs->PutCollect("K",_variant_t(pData.k));
    sData.Format("11-12月-09");
    m_SqlRs->PutCollect("M",LPCTSTR(sData));

    m_SqlRs->GetFields()->GetItem("N")->AppendChunk(var);
    m_SqlRs->Update();
    m_SqlRs->Close();
    }
    m_SqlConn->CommitTrans();
    }
    catch(...)
    {
    m_SqlConn->RollbackTrans();
    return false;
    }
    return true;
    }
      

  6.   

    如果你vector每个元素就是一个点的坐标数字,那么就用text字段,存取长字符串很方便,根本不用getchunk,和appendchunk。command对象配合parameter对象就很容易。image字段适合保存纯粹的二进制字节数据。