![](/img/trans.png)
[英]How to pass std::vector<void*> * as std::vector<MyStruct*>* to a function
[英]How to pass a dynamic array ( std::vector ) to an odbc function SQLBindParameter
函数原型如下:
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 ?
注意:我使用std :: vector来方便声明。 在某些情况下,我无法将c.str()发送到数据库,驱动程序应该能够修改字符串
如果您使用的是C ++ 11,则可以执行std::string& str = myVectorOfStrings[i]; char* buf = &str[0]
std::string& str = myVectorOfStrings[i]; char* buf = &str[0]
; 无需副本。
如果您使用的是C ++ 03, 那么它的安全性还有待商bat 。 严格地说,当时的字符串并不能保证是连续的,但是出于种种原因,我们很多人认为,假设它是足够安全的。
如果您对此不满意,那么您当前的方法是非常正确的……然后,是的, char* buf = &myVectorOfCopiedChars[0]
是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.