使用 ADO 解決PostGis數據庫 Bytea類型 數據讀寫問題

 

最近做一個功能,需要將一串點存儲到PostGis某個字段中,思來想去決定用bytea來存儲。

數據寫入:    1、我是將一串點(x y z)放到一個數組中,例如:CArray<double ,double> pts;

pts 強轉成byte*  char* lpBuf = (char*)m_pts.GetData();

2、將byte* 加密,使用encode算法加密;代碼下面貼出。

3ADO 執行語句時 插入。(其實byteapostgis中就是字符串存儲的)

使用insert into Table  Values( ) sql語句操作寫入

:strCmd.Format(" Insert into blob_db VALUES(%d,'aaaaaa','%s') ",9999, str1);

數據讀取:

1、使用ADO獲取_RecordsetPtr pRes 結果後

先獲取數據長度lDataLength = pRs->GetFields()->GetItem((LPCSTR)strField)->ActualSize

  1. 2、獲取variant 數據_variant_t varBLOB = pRs->GetCollect((LPCSTR)strField);

  2. SafeArrayAccessData 得到buf* 後 使用decode 解密;

    LPBYTE lpBuf = NULL;

    if( lDataLength>0 )

    {

    SafeArrayAccessData( varBLOB.parray,(void**)&lpBuf );

    char* strRet = (char*)lpBuf;

    int length = strlen(strRet);

    double* val = (double*)DecodeString((const char *)lpBuf, lDataLength);

    double* pdouble = (double*)val;

    }

  3. 逐個獲取 double 數據

    double* pdouble = (double*)val;

    for (int i = 0;i<lDataLength/sizeof(double);i++)

    {

    m_pts.Add(*(pdouble+i));

    }     SafeArrayUnaccessData(varBLOB.parray );

    lpBuf = NULL;

 

加密解密算法

 

 

CString EncodeString(const char *p, int len)

{

if( p==NULL )return CString();

char tmp[16] = {0};

CString ret;

int pos=0;

while( pos<len )

{

sprintf(tmp,"%02x",(BYTE)*(p+pos));

ret = ret + tmp;

pos++;

}

return ret;

}

 

void* DecodeString(const char *p, int len)

{

if( p==NULL )return NULL;

char tmp[4] = {0};

unsigned char *ret = new unsigned char[len];

int v;

int pos=0;

while( p[0]!=0 && p[1]!=0 )

{

tmp[0] = p[0];

tmp[1] = p[1];

v = 0;

if( sscanf(tmp,"%x",&v)<=0 )

break;

ret[pos++] = (unsigned char)v;

p+=2;

}

return ret;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章