[英]Access Violation with OCCI next() and 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
字節大。
如果您想知道數組數組(如在我的解決方案中)和指向指針的指針(鋸齒狀數組)之間的區別,請參閱例如我的這個舊答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.