OCCI next()和setDataBuffer()的访问冲突

问题描述 投票:0回答:1

所有人,

不幸的是,我看不见森林,需要帮助。我通过具有70列的SELECT语句调用结果集。我为所有70列的char初始化缓冲区,并使用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;
            }
c++ next occi
1个回答
0
投票

问题是您分配了data_array,因为您将其创建为jagged array,而不是setDataBuffer所需的连续内存数组。

如果您想使用setDataBuffer使用动态分配,我建议使用类似的方法:

new[]

然后using data_type = int8_t[1000][500]; auto data_array = new data_type[70]; 的每个元素将是一个连续的内存区域,data_array个字节大。


[如果您想知道数组的数组(如我的解决方案)和指针的指针(锯齿状的数组)之间的区别,请参见1000 * 500

© www.soinside.com 2019 - 2024. All rights reserved.