longle323 发表于 2011-04-15 13:34

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。

windwiny 发表于 2011-04-15 23:59

标记下

也在写一些函数,还没到这深度

longle323 发表于 2011-05-03 09:44

今天又做了次小测试,发现BLOB根本写不进去数据库,到是写入loblocator了,但没写入数据库啊!把指针释放了再读根本读不出先前写的数据!长度为0!
页: [1]
查看完整版本: DB2 C编程 遇到问题 希望达人帮帮忙,小弟拜谢了!