使用 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;

}

 

转载自:https://blog.csdn.net/tudou23115/article/details/79363045

You may also like...

退出移动版