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

C++ 如何在ODBC中可移植地实现任意结果集的行绑定,同时避免对齐问题?,c++,odbc,memory-alignment,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)

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

按行绑定是一件很麻烦的事。但是,我认为可以在单独的SQLINTEGER/SQLLEN数组中指定指示符(假设您指的是StrLen_或_IndPtr参数)(取决于ODBC的新程度)。寻找类似SQL_DESC_INDICATOR_PTR的内容,还有一个是长度。您可以通过在描述符中设置字段,将其与数据分开设置。如果这样做,将避免对齐问题,并将行数据与指示器/长度分开

更新:


更新2:只需确保整数值(就像您的指示符)在4字节边界上正确对齐,或者Sparc要求的任何东西。

我最终处理它的方式是将长度指示符和wchars放在单独的、正确键入的缓冲区中。它们实际上不必生活在同一个缓冲区中,因为ODBC所做的只是在每次要进入下一个地址集时向每个地址添加“struct size”


我通过在堆栈上分配两个小数组并减去相邻单元格之间的指针,计算出了WCHAR和SQLLEN所需的对齐方式。然后,我对两条路线进行了LCM,并向缓冲区添加了填充,这样每个集合将占用该空间的倍数。我给ODBC提供了一个虚假的“struct size”。

如果您说的是“通过将SQL_DESC u INDICATOR_PTR和SQL_DESC u OCTET_length_PTR描述符字段设置为不同的值,可以将指示符和长度值存储在单独的缓冲区中;如果这样做,则结构包含第三个元素。”,我认为这只是意味着它们可以在“struct”的不同字段中,但它们仍然需要在同一个缓冲区中,所以这不会解决问题,我认为您没有抓住要点。您可以创建一个包含列和指示器的结构。然后决定行集的大小,并创建结构中N的数组。将行绑定类型设置为结构的大小。调用SQLBindCol时,传递结构数组第一行中元素的地址。当驱动程序写入第二行时,它会将行绑定类型(结构的sizeof)添加到每个列传递给SQLBindCol的值中。因此,结构中可能有“孔”,对齐方式取决于您。您需要在结构中使用正确的类型。问题是,这必须适用于任意结果集,没有结构。如果你再看一遍这个问题,我只是在使用一个字符缓冲区。为了澄清,我理解行绑定是设计用于结构的,当你在编译时知道结果集的结构时。但在我的例子中,我需要能够处理任意查询,因此在这种情况下,您需要确保您的指示符在4字节边界上对齐(或Sparc要求的任何内容)。如果在字段之间的缓冲区中留有洞,这无关紧要,但需要对齐整数值。