如何将动态数组(std :: vector)传递给odbc函数SQLBindParameter

时间:2011-09-15 15:19:04

标签: c++ odbc

函数原型如下:

SQLRETURN SQLBindParameter(
      SQLHSTMT        StatementHandle,
      SQLUSMALLINT    ParameterNumber,
      SQLSMALLINT     InputOutputType,
      SQLSMALLINT     ValueType,
      SQLSMALLINT     ParameterType,
      SQLULEN         ColumnSize,
      SQLSMALLINT     DecimalDigits,
      SQLPOINTER      ParameterValuePtr,
      SQLLEN          BufferLength,
      SQLLEN *        StrLen_or_IndPtr);

我对参数6,8 9和10以及它们如何应用于变量字符串更感兴趣。其他内置数据类型似乎问题较少 我在互联网上看到的所有例子 例如http://msdn.microsoft.com/en-us/library/ms709287(v=vs.85).aspx 使用看似直截了当的静态数组。但是我要 使用std :: vector,我的所有尝试都失败了。

所以说我想绑定这些字符串。

std::vector<std::string> countries = boost::assign::list_of("Argentina")( "Burkina Faso")( "China")( "Dominica Republic");

注意:我使用std::vector<string>作为声明的便利。 我无法将c.str()发送到数据库,驱动程序应该能够在某些情况下修改字符串

所以我宣布一个像这样的缓冲区

std::vector<char> my_data;

并将我的字符串复制到缓冲区。
如何通过这些参数:

ColumnSize ?
ParameterValuePtr ? // this I think I am sure should be &my_data[0]
BufferLength ?

1 个答案:

答案 0 :(得分:0)

  

注意:我使用std :: vector作为声明的方便。我无法将c.str()发送到数据库,驱动程序应该能够在某些情况下修改字符串

如果你正在使用C ++ 11,那么你可以std::string& str = myVectorOfStrings[i]; char* buf = &str[0];无需复印。

如果你正在使用C ++ 03 it's a little more debatable as to how safe this is。严格来说,当时的字符串并不保证是连续的,但我们中的许多人都认为 - 出于各种原因 - 无论如何都应该安全地承担它。

如果您对此不满意,那么您当前的方法非常正确......然后,是的,char* buf = &myVectorOfCopiedChars[0]是正确的。