3

我有一个类,它接受一个 SQL 查询,执行它,然后使用逐行绑定将结果集中的每一列绑定为 SQL_C_WCHAR。

现在我这样做的方法是分配一个 char 向量,并确定提供 SQLBindColumn 的指针,如下所示:

  • 第 1 列的缓冲区 = &vec[0]
  • 第 1 列长度指示器的缓冲区 = &vec[0] + (sizeof(SQLWCHAR) * 第 1 列的长度)
  • 第 2 列的缓冲区 = &vec[0] + (sizeof(SQLWCHAR) * 第 1 列的长度) + sizeof(长度指示符)
  • 第 2 列长度指示符的缓冲区 = &vec[0] + (sizeof(SQLWCHAR) * 第 1 列长度) + sizeof(长度指示符) + (sizeof(SQLWCHAR) * 第 2 列长度)

等等

这会导致一些对齐问题(在 SPARC 上)。我知道我需要添加一些填充,但我不知道如何计算便携性。

4

2 回答 2

2

我最终处理它的方式是将长度指示器和 wchars 放在单独的、正确键入的缓冲区中。它们实际上不必住在同一个缓冲区中,因为 ODBC 所做的只是在每次想要进入下一组时将“结构大小”添加到每个地址。

通过在堆栈上分配两个小数组并减去相邻单元格之间的指针,我找出了 WCHAR 和 SQLLEN 所需的对齐方式。然后我采用了两个对齐的 LCM,并在缓冲区中添加了填充,因此每个集合将占据该空间的倍数。我将 ODBC 喂给了一个虚假的“结构大小”。

于 2011-08-25T17:05:16.220 回答
1

逐行绑定是一种痛苦。但是,我认为指标(假设您的意思是 StrLen_or_IndPtr 参数)可以在单独的 SQLINTEGER/SQLLEN 数组中指定(取决于您的 ODBC 有多新)。寻找类似 SQL_DESC_INDICATOR_PTR 的东西,长度上还有另一个。您可以通过设置描述符中的字段来将这些设置与数据分开设置。如果这样做,您将避免对齐问题并将行数据与指示器/长度分开。

更新: http: //msdn.microsoft.com/en-us/library/ms711730 (v=vs.85).aspx

Update2:只需确保整数值(如您的指示符)在 4 字节边界或 Sparc 要求的任何内容上正确对齐。

于 2011-08-12T08:05:49.053 回答