DB2 C编程 遇到问题 希望达人帮帮忙,小弟拜谢了!
本帖最后由 longle323 于 2011-04-15 13:46 编辑问题1:最近在做oracle到DB2的移植,开始上面要求要用OCI接口,因为DB2V9.7FP1之后的确实提供了OCI的类似接口DB2CI接口,但我在做BLOB读取的时候遇到问题,同样的代码在ORACLE下是没问题的,到DB2CI接口中就不行了,插入一个1M以下的图片正常,大的就报数据截断的错误了。大约在1114078字节附近,是不是BLOB在DB2下需要设置特别的参数呢。而且我发现CLI中有个SQL_BLOB_MAXSIZE的宏定义和这个数字很接近,不知道我是不是搞错了什么东西。
代码大概流程:
1. 插入一个EMPTY_BLOB(),
2. SELECT 这个BLOB FOR UPDATE
进行select的时候要绑定BLOB_locator
if (status = OCIDefineByPos(stmthp, &defnp, errhp, (ub4) 1,
(dvoid *) &blob, (sb4) filelen, (ub2) SQLT_BLOB,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DEFAULT))
{
printf("FAILED: OCIDefineByPos()\n");
return ERR;
}
3. 向BLOB_LOCATOR中循环插入数据,我是分片插入的,在循环前先判断是多片还是一片,已经插入过一次,然后做循环,小图片是能插入的 可是图片一大就不行了,报上面图片中的错误
do
{
if (remainder > MAXBUFLEN)
nbytes = MAXBUFLEN;
else
{
nbytes = remainder;
piece = OCI_LAST_PIECE;
}
if (fread((void *)bufp, (size_t)nbytes, 1, fp) != 1)
{
printf("ERROR: read file.\n");
piece = OCI_LAST_PIECE;
}
retval = OCILobWrite(svchp, errhp, lobl, &amtp, offset, (dvoid *)bufp,
(ub4) nbytes, piece, (dvoid *)0,
(sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
(ub2) 0, (ub1) SQLCS_IMPLICIT);
remainder -= nbytes;
} while (retval == OCI_NEED_DATA && !feof(fp));
问题2:我在用DB2的CLI接口做图片测试时发现两个奇怪的问题,针对DB2 CLI的示例程序dtlob.c中的一次写入函数BlobWriteAsAWhole,我在bindfiletoparam的时候总是出错,绑定时虽然没出错,执行EXECUTE时报参数数量错误,只是绑定file都报,很无奈。我完全是编译的DB2的示例文件都不通过。
问题3:ClobReadASelectedPiece函数中,bindcol用SQL_C_BLOB_LOCATOR绑定BLOB,取blob的大小总是绑定出错,我已经按照IBM文档说的顺序和方法进行绑定了,依然报错HY003,程序类型越界。我现在只能通过把BLOB全取出来记录读取的长度来获得BLOB大小,现在没有要求这个干还可以,图片也不是很大,将来上如果有上G的文件这么干是肯定不行的。跑那个示例程序也报错。
另外我想问下必须要设置ODBC数据源吗,能不能直接连DB2数据库,比如SAMPLE,我不想用我在ODBC中设置的别名DB2_TEST。 标记下
也在写一些函数,还没到这深度 今天又做了次小测试,发现BLOB根本写不进去数据库,到是写入loblocator了,但没写入数据库啊!把指针释放了再读根本读不出先前写的数据!长度为0!
页:
[1]