0

我使用以下代码从基于 WBTRV32.dll 的 BTrieve 6.15 数据库文件中收集数据我总是在读取下一个数据线的位置返回错误代码 22 - 这是我的 BTrieve 文件没有固定列宽的问题吗?

// Open file
RecordBuffer dataBuffer = new RecordBuffer();
int bufferLength = System.Runtime.InteropServices.Marshal.SizeOf(dataBuffer);
short status = (short)BTRCALL(0, positionBlock, ref dataBuffer, ref bufferLength, fileNameArray, 0, 0);

        if (status == 0) <== Here Status = 0
        {
            // Get first record
            dataBuffer = new RecordBuffer();
            status = (short)BTRCALL(12, positionBlock, ref dataBuffer, ref bufferLength, fileNameArray, 0, 0); //BGETFIRST

            if (status == 0) <== Here Status = 0
            {
                ...                
            }

            // Get subsequent records
            while (status == 0) // BReturnCodes.END_OF_FILE or an error will occur
            {
                dataBuffer = new RecordBuffer();
                status = (short)BTRCALL(6, positionBlock, ref dataBuffer, ref bufferLength, fileNameArray, 0, 0); //BGETNEXT

                if (status == 0) <=== Here Status = 22 data buffer length overrun
                {

                }
            }

}

4

1 回答 1

1

状态 22 表示“数据缓冲区太短”。根据文档

将数据缓冲区长度设置为大于或等于要检索的记录长度的值。

您需要确保在每次调用之前将数据缓冲区长度设置为正确的值。在您的代码中,您只需设置bufferLength一次变量。如果您有可变长度的记录,则该值会在返回时设置为记录的长度,因此作为开发人员,您可以知道返回了多少数据。在下一次 GET 调用之前,您需要将其重置为您期望返回的最大值。

于 2015-11-02T12:36:35.367 回答