最近做一個功能,需要將一串點存儲到PostGis某個字段中,思來想去決定用bytea來存儲。
數據寫入: 1、我是將一串點(x y z)放到一個數組中,例如:CArray<double ,double> pts;
將pts 強轉成byte* char* lpBuf = (char*)m_pts.GetData();
2、將byte* 加密,使用encode算法加密;代碼下面貼出。
3、ADO 執行語句時 插入。(其實bytea在postgis中就是字符串存儲的)
使用”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
2、獲取variant 數據_variant_t varBLOB = pRs->GetCollect((LPCSTR)strField);
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;
}
逐個獲取 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;
}