如何在ODBC中可移植地实现任意结果集的行方式绑定,同时避免对齐问题?

时间:2011-08-11 19:44:10

标签: c++ odbc memory-alignment

我有一个类,它接受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上)。我知道我需要添加一些填充,但我不知道如何计算可移植的数量。

2 个答案:

答案 0 :(得分:2)

我最终处理它的方法是实际将长度指示器和wchars放在单独的,正确键入的缓冲区中。它们实际上不必存在于同一个缓冲区中,因为ODBC所做的就是每次想要进入下一组时为每个地址添加“struct size”。

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

答案 1 :(得分: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所需的任何内容上正确对齐。