C++读取Oracle中clob类型使用otl_lob_stream,发现读取的数据只是覆盖原来的数据, 原来的数据还保留,怎么在读取前清空呢?
代码如下所示:
正如上述代码的SQL语句,我是想从表中获取三个字段的值分别是Id,Url和Content,其中Content是Clob类型的。
程序执行SQL语句:“SELECT id, url, CONTENT FROM PUBOPANALYSIS where id > %d And RowNum < 100”之后可以查询出100条。
接着取出第二行,第二行的Content是“abcd”,比第一行短,但是读取出来的内容却是:“abcd567890”;
之后的情况类似....
请问各位,有什么方法解决吗?我找了很多资料没有搞懂这个怎样初始化缓冲区..用了好几次的s.flush()都没有效果。。。
otl_stream s; otl_lob_stream lob; otl_long_string lstrCont(1024*1024); //下面是构建成Sql语句,查询id大于某个值的100行中id,url,content三列的值 CString strSql; strSql.Format( "SELECT id, url, CONTENT FROM PUBOPANALYSIS where id > %d And RowNum < 100", m_Pid); try { s.set_lob_stream_mode(true); s.open(1, strSql.GetBuffer(), g_otlOra); strSql.ReleaseBuffer(); while (!s.eof()) { WebPage wp; ZeroMemory(chUrl, 1024*2); //这里清空获取Url的值的变量,如果这里有个清空lob的值的函数或者方法,我想问题应该可以解决 s>>wp.nId>>chUrl>>lob; wp.strUrl = chUrl; while (!lob.eof()) //循环获取Content的内容 { lob>>lstrCont; strMsg.Format( "%s", lstrCont.v ); wp.strCont += strMsg; } lob.close(); arr.Add(wp); //这里把查询下来的数据拼成一个数组(或链表) }出现的情况描述如下:
正如上述代码的SQL语句,我是想从表中获取三个字段的值分别是Id,Url和Content,其中Content是Clob类型的。
程序执行SQL语句:“SELECT id, url, CONTENT FROM PUBOPANALYSIS where id > %d And RowNum < 100”之后可以查询出100条。
现在我需要循环读出查询出来的每一行数据,但是发现问题是这样的,问题出现在Content的读取上,举个例子:
假如读取出来的第一行的Content是“1234567890”,我取出完毕;接着取出第二行,第二行的Content是“abcd”,比第一行短,但是读取出来的内容却是:“abcd567890”;
之后的情况类似....
请问各位,有什么方法解决吗?我找了很多资料没有搞懂这个怎样初始化缓冲区..用了好几次的s.flush()都没有效果。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(20)
谢谢,我把 otl_lob_stream lob; 挪到while循环里面,解决了问题
推荐你使用 C++ ORM ODB,
otl_stream s;
otl_stream s; 能弄为 while 循环内的局部变量,不就解决了吗
嗯 谢谢
现在我已经把
的定义放在了循环体里面了,但是还是一样的效果,说明问题是在
这里。
回复
otl不是提供了N多个例子么?你看看呗,我记得没有你这么复杂啊,就是一个变量清空的过程呀,我用过mysql的那个接口,都没这么复杂
回复
谢谢啊,我第一次用otl,还有很多不懂的问题,找出这个 bug都找了半天时间。之前数据库用的是sqlserver,现在改成了Oracle。不太懂otl,所以没有找到合适方法。例子也找了,但是没有找到我想要的,所以发帖求助。
回复
来,照着这个做,http://blog.csdn.net/heangel/article/details/7212260
回复
嗯 好
如果没有什么特别好的方法,就把读出来的值记录下来,然后手动清空呗,这有啥纠结的,otl本来就不是十全十美的
求助啊啊啊
我找了,有,但是不是我想要的,有用于算出整个数据长度,但是没有找到算当前接收的长度的方法。上面的zeromemory只是初始化了用于接收Url的变量的值,如果初始化别的值也有可能会出现我上面提到的问题,是很有可能会报错,所以清零。由于没有清空用于接收Content的方法,所以出现了上面提到的问题,如果可以找到一个方法初始化这个lob就好了,只是我一直没有找到,所以来求助。
这种程序一般有一个属性标识数据长度的,而不是普通的以结尾。建议往这个方向找下API文档。你这个程序之所以能跑是因为前面的zeromemory刚好把所有数据初始化成了,如果你全部初始化成比如?,估计你的程序会报错。
回复
嗯 好
回复
是啊,, 生命没有必要被语言浪费,连接,然后查询,,那么简单的东西, 为什么要复杂了
回复
晕....还是帮我解决一下我上面提到的问题吧。
回复
换语言
回复
好吧...可是我早已决定要解决这个问题了。
Why C++