使用 ADO 解决PostGis数据库 Bytea类型 数据读写问题
最近做一个功能,需要将一串点存储到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;
}
转载自:https://blog.csdn.net/tudou23115/article/details/79363045