c++ - OCCI next() 和 setDataBuffer() 访问冲突
问题描述
不幸的是,我只见树木不见森林,需要帮助。我通过一个 SELECT 语句调用一个结果集,它有 70 列。我为所有 70 个字符列初始化缓冲区,并使用 setDataBuffer 设置它们。不幸的是,我只能检索 15-17 条记录。之后,我收到一条访问冲突错误消息。如果我尝试 next(1000) 它根本不起作用。我认为这与指针有关,但我没有看到错误。有谁知道我做错了什么?
#pragma region Arrays
char*** data_array = new char**[70];
for (unsigned int i = 0; i < 70; ++i)
{
data_array[i] = new char*[1000];
for (unsigned int j = 0; j < 1000; ++j)
{
data_array[i][j] = new char[500];
}
}
ub2** size_array = new ub2 * [70];
for (unsigned int i = 0; i < 70; ++i)
{
size_array[i] = new ub2[1000];
}
sb2** ind_array = new sb2 * [70];
for (unsigned int i = 0; i < 70; ++i)
{
ind_array[i] = new sb2[1000];
}
ub2** rc_array = new ub2 * [70];
for (unsigned int i = 0; i < 70; ++i)
{
rc_array[i] = new ub2[1000];
}
#pragma endregion
#pragma region setDataBuffer
for (unsigned int i = 0; i < 70; ++i)
{
resultSet->setDataBuffer(i + 1, data_array[i][0], OCCI_SQLT_STR, 500, size_array[i], ind_array[i], rc_array[i]);
}
#pragma endregion
try
{
ResultSet::Status resultSetStatus = resultSet->next(25);
if (resultSetStatus == ResultSet::Status::DATA_AVAILABLE)
{
unsigned int rowCount = resultSet->getNumArrayRows();
for (unsigned int row = 0; row < rowCount; ++row)
{
for (unsigned int column = 0; column < 70; ++column)
{
auto value = data_array[column][row];
auto vsize = *size_array[column];
std::string cellContent(value, vsize);
}
}
}
}
catch(SQLException& sqlEx)
{
std::string msg = sqlEx.getMessage();
int i = 0;
}
解决方案
问题在于您的分配data_array
,因为您将其创建为锯齿状数组,而不是所需的连续内存数组setDataBuffer
。
如果您想使用动态分配,new[]
我建议使用以下方法:
using data_type = int8_t[1000][500];
auto data_array = new data_type[70];
然后每个元素data_array
将是一个连续的内存区域,1000 * 500
字节数很大。
如果您想知道数组数组(如我的解决方案中)和指向指针的指针(锯齿状数组)之间的区别,请参见例如我的这个旧答案。
推荐阅读
- api - 来自后部导航应用程序在颤动中不刷新
- mysql - 将文本值与 LEFT JOIN 合并在一列中,并将 NULL 替换为预定义的措辞
- mysql - 如果未保存原始文件的大小,是否可以获得 MySQL blob 原始文件大小?
- java - java.lang.IllegalArgumentException:消息头字段中的非法字符:授权:基本
- python - 使用 python 从 DynamoDB 查询所有行
- java - 生成随机 UUID 非阻塞
- javascript - Vue 2 向父组件添加插槽
- docker - 创建 docker 容器时无法运行脚本
- java - 在 RecyclerView 中管理视图的回收方式
- amazon-web-services - AWS CDK 从嵌套堆栈访问父堆栈中的资源