OCCI - setDataBuffer + 向量<struct>
OCCI - setDataBuffer + vector<struct>
尝试通过将包含 char 缓冲区的结构存储到向量中来最大程度地减少 OCCI 数组提取的行数,代码如下:
struct Columns { char buffer[1000][300]; };
int i = 1;
Columns col;
ub4* ub = NULL;
results->setDataBuffer( i++, col.buffer, OCCI_SQLT_STR, sizeof( col.buffer[ 0 ] ), ub );
vec.push_back( col );
cout << "Before, vec size: " << vec.size( ) << "\n"; // prints 1, as expected
while ( results->next( 1000 ) ) {
for ( size_t j = 0; j < results->getNumArrayRows( ); ++j ) {
cout << vec[ 0 ].buffer[ j ] << endl;
}
现在由于某种原因,这不起作用。但是,如果我不使用 col.buffer,而是创建一个 char buffer[1000][300] 并将其放入 setDataBuffer,然后在 cout 部分执行:
cout << 缓冲区[j] << endl;
效果很好。所以我不太确定我哪里搞砸了?
char 缓冲区与 col.buffer 完全相同,不是吗?
我认为这无关紧要,但头文件中定义了 struct Columns。
我猜 setDataBuffer
填充了您作为参数传递的缓冲区(此处为 col.buffer),然后将其推入向量,因此分配了一个新的 struct Columns
vec
并复制 col
内容。现在 col
和 vec[0]
是两个不同的对象。
然后你调用一些方法来填充你第一次传递给它的缓冲区。所以它填充 col.buffer
,而你读取 vec[0].buffer
,这是不同的,因为它们是 2 个不同的对象。
一种解决方案是 vec.emplace_back();
创建一个实例,然后将 vec[0].buffer
传递给 setDataBuffer
。但要注意向量中元素的地址。如果您修改向量(添加或删除元素),它可以重新分配它的内容,并且元素地址可能会改变。
尝试通过将包含 char 缓冲区的结构存储到向量中来最大程度地减少 OCCI 数组提取的行数,代码如下:
struct Columns { char buffer[1000][300]; };
int i = 1;
Columns col;
ub4* ub = NULL;
results->setDataBuffer( i++, col.buffer, OCCI_SQLT_STR, sizeof( col.buffer[ 0 ] ), ub );
vec.push_back( col );
cout << "Before, vec size: " << vec.size( ) << "\n"; // prints 1, as expected
while ( results->next( 1000 ) ) {
for ( size_t j = 0; j < results->getNumArrayRows( ); ++j ) {
cout << vec[ 0 ].buffer[ j ] << endl;
}
现在由于某种原因,这不起作用。但是,如果我不使用 col.buffer,而是创建一个 char buffer[1000][300] 并将其放入 setDataBuffer,然后在 cout 部分执行: cout << 缓冲区[j] << endl;
效果很好。所以我不太确定我哪里搞砸了?
char 缓冲区与 col.buffer 完全相同,不是吗?
我认为这无关紧要,但头文件中定义了 struct Columns。
我猜 setDataBuffer
填充了您作为参数传递的缓冲区(此处为 col.buffer),然后将其推入向量,因此分配了一个新的 struct Columns
vec
并复制 col
内容。现在 col
和 vec[0]
是两个不同的对象。
然后你调用一些方法来填充你第一次传递给它的缓冲区。所以它填充 col.buffer
,而你读取 vec[0].buffer
,这是不同的,因为它们是 2 个不同的对象。
一种解决方案是 vec.emplace_back();
创建一个实例,然后将 vec[0].buffer
传递给 setDataBuffer
。但要注意向量中元素的地址。如果您修改向量(添加或删除元素),它可以重新分配它的内容,并且元素地址可能会改变。