根据说明文档otl_stream类构造函数的第一个参数是缓存区中能存放查询结果的行数,按正常理解,如果表中有100条记录,我将该参数设置50条应该是可以的,但实际上不行,在读第50条的f2的时候就报错,所以我将该参数设置到200,但是一样读到第100行的f2的时候报错,错误与设置50是一样的,不同只是一个在读第50行最后一列的值时报错,一个在读第100行最后一列的值时报错,且otl_exception中所有属性成员都为空字符串!我将otl源码中的抛出异常的那一句去掉(这是下策,可能造成严重的潜在问题,但是我想看一下结果,而且只是去掉一个throw语句),我想总该没有错误了吧?合理的话,到第100行之后,i.eof()语句应该为false,但是实际却仍是true,所以程序继续执行循环然后报错,看来简单修改一下otl源码也不行,这如何解决呢?很急,望有高手能救一把!
void select() {
otl_stream i(50, "select f1,f2 from test_tab", db);
float f1, f2;
while (!i.eof()){ //不知为何i.eof()总是为true?
//i.set_flush(true); //此句加与不加是一样的
i>>f1>>f2;
cout<<"f1="<<f1<<", f2="<<f2<<endl;
} }
我用的是SqlServer2005,otl版本4.0.334(最新的)
看一下这里的示例代码,在whil(!i.eof())之前进行了额外的操作(i<<8<<8;):
void select() { otl_stream i(50, // buffer size "select * from test_tab where f1>=:f11<int> and f1<=:f12<int>*2", // SELECT statement db // connect object ); // create select stream float f1; char f2[31]; i<<8<<8; // assigning :f11 = 8, :f12=8 // SELECT automatically executes when all input variables are // assigned. First portion of output rows is fetched to the buffer while(!i.eof()){ // while not end-of-data i>>f1; if(i.is_null()) cout<<"f1=NULL,"; else cout<<"f1="<<f1<<","; i>>f2; if(i.is_null()) cout<<"f2=NULL"; else cout<<"f2="<<f2; cout<<endl; } }
这个额外的操作是设置示例中sql语句(“where f1>=:f11<int> and f1<=:f12<int>*2”)中的参数,而我的sql语句中没有where和后面的条件,不需要参数,如果我加上去,会报错:“No input variables have been defined in SQL statement”
@Patrickz10: 或者换成这里的读取方法:
void select() { otl_stream i(50, // buffer size "select * from test_tab " "where f1>=:f11<int> and f1<=:f12<int>*2", // SELECT statement db // connect object ); // create select stream int f1; char f2[31]; otl_stream_read_iterator<otl_stream,otl_exception,otl_lob_stream> rs; rs.attach(i); // attach the iterator "rs" to the stream "i". i<<8<<8; // assigning :f11 = 8, :f12 = 8 // SELECT automatically executes when all input variables are // assigned. First portion of output rows is fetched to the buffer while(rs.next_row()){ // while not end-of-data rs.get(1,f1); rs.get(2,f2); cout<<"f1="<<f1<<", f2="<<f2<<endl; } rs.detach(); // detach the itertor from the stream i<<4<<4; // assigning :f11 = 4, :f12 = 4 // SELECT automatically executes when all input variables are // assigned. First portion of output rows is fetched to the buffer while(!i.eof()){ // while not end-of-data i>>f1>>f2; cout<<"f1="<<f1<<", f2="<<f2<<endl; } }
@dudu: 改好了,暂时未查明原因,估计是某个参数变量(如db是局部变量),与select不在同一函数作用域,然后程序正常运行,又不知道什么时候程序才发现这个变量无效了,就将某个状态变量设置为无效,但是直到运行到超出缓存才去检查这个状态,结果就运行不下去了,初步理解是这样!
改成 i>>f1>>f2>>endr; 或 i.move_next();试试