PSQLODBC会封装的,他是这样封装的:
二进制的图象文件按字节读出,转换成字符串
转换规则如下:
1. ASCII 为(0-31,39,92,127-255)(十进值) 转换为三位的八进制,前面加上\\, 比如ASCII 39 转换为 \\047.
2. 其余的ASCII不用转换
3. 将这些字符串连接起来,前后加上引号,强制转换为BETAE,
如 图象文件 4个字节 0A'B
转换的结果为 '\\000A\\047B'::BYTEA
二进制的图象文件按字节读出,转换成字符串
转换规则如下:
1. ASCII 为(0-31,39,92,127-255)(十进值) 转换为三位的八进制,前面加上\\, 比如ASCII 39 转换为 \\047.
2. 其余的ASCII不用转换
3. 将这些字符串连接起来,前后加上引号,强制转换为BETAE,
如 图象文件 4个字节 0A'B
转换的结果为 '\\000A\\047B'::BYTEA
在导文本文件时没有问题,导图象时候就出错,估计可能是文件中字符的问题
unsigned char *cdata = 0;
int size;
FILE *fp = 0;struct stat buf;
int result;result = stat("c:/test.JPG", &buf);if(result != 0)
return false;size = buf.st_size;cdata = new unsigned char[size];fp = fopen("c:/test.JPG", "rb");fread(cdata, sizeof(unsigned char), size, fp);
size_t newLen = 0;unsigned char* newbuf = PQescapeBytea(cdata, size, &newLen);const char *paramValues[1];paramValues[0] = (char*)newbuf;
// paramValues[0] = "joe's place"; //用字符串没有问题m_Pres = PQexecParams(m_Pconn ,
"insert into lraster values(1999,$1)",
1, /* 一个参数 */
NULL, /* 让后端推导参数类型 */
paramValues,
NULL, /* 因为是文本,所以不需要参数长度 */
NULL, /* 缺省是参数都是文本 */
1); /* 要求获取二进制结果 */
改为insert into lraster values(1999,$1::BYTEA)试一下