我正试图从我的 SQL 数据库中提取一个字符串,但由于某种原因我的参数是错误的,我不确定为什么。这是我的代码:
SQLHENV environHandle;
SQLHDBC connectHandle;
SQLHSTMT statement;
SQLCHAR* connectString = "MY_CONNECTION_STRING";
string path;
int jobID;
SQLINTEGER pathstrlen = SQL_NTS;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &environHandle);
SQLSetEnvAttr(environHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, environHandle, &connectHandle);
SQLDriverConnect(connectHandle, NULL, connectString, SQL_NTS, NULL, 1024, NULL, SQL_DRIVER_NOPROMPT);
SQLAllocHandle(SQL_HANDLE_STMT, connectHandle, &statement);
//THIS IS THE BINDPARAMETER WITH THE ISSUE...
SQLBindParameter(statement, 1, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_VARCHAR, 400, 0, (SQLPOINTER)path.c_str(), path.length(), &pathstrlen);
SQLBindParameter(statement, 2, SQL_PARAM_OUTPUT, SQL_INTEGER, SQL_INTEGER, 10, 0, &jobID, 0, &pathstrlen);
SQLExecDirect(statement, (SQLCHAR*)"{CALL SP(?,?)}", SQL_NTS);
它运行良好,但不会获取我请求的字符串信息,而第二个参数(获取整数)工作正常。我已经尝试将 ParameterType 更改为多个不同的东西,但我要么收到错误(例如,SQL_LONGVARCHAR 已被弃用)。
在SQL中,我试图获取的数据如下:
@Path nvarchar(4000) OUT
set @Path = 'test'
提前感谢任何可以阐明这一点的人。我整天都在拔头发。
最佳答案
ODBC 支持Unicode parameter types所以分别使用 SQL_C_WCHAR
和 SQL_WVARCHAR
而不是 SQL_C_CHAR
和 SQL_VARCHAR
。
您还有另外两个问题。
首先,您要传递一个 ANSI string
作为参数。如果您使用的是 Unicode,则需要使用宽字符串 - wstring
。
其次,您没有将有效缓冲区传递给 SQLBindParameter
。 string.c_str() 返回的值是一个 const char*
,它是一个只读缓冲区。将 hat 传递给需要可写缓冲区的函数是无效的 - 这样做会损坏您的字符串。但是,您不会在您的案例中看到任何损坏,因为您对 path.length()
的调用将返回零,因此 SQLBindParameter
永远不会返回任何数据。
您需要声明 WCHAR
数组缓冲区并将其传递给 SQLBindParameter
,这将为其提供一个有效的缓冲区来写入数据。然后,如果您需要在 C++ 对象中使用该缓冲区,则可以将该缓冲区传输到 wstring
。
所以像这样:
WCHAR path[401]; // 401 - width of you column + 1 for the null terminator
SQLBindParameter(statement, 1, SQL_PARAM_OUTPUT, SQL_C_WCHAR, SQL_WVARCHAR, 400, 0, (SQLPOINTER)path, sizeof(path), &pathstrlen);
编辑
F从查看ODBC data conversion table如果您不想在应用程序中处理 Unicode 字符串,看来您应该能够让 ODBC 为您将数据从 Unicode 转换为 ANSI。
char path[401]; // 401 - width of you column + 1 for the null terminator
SQLBindParameter(statement, 1, SQL_PARAM_OUTPUT, SQL_C_WCHAR, SQL_WVARCHAR, 400, 0, (SQLPOINTER)path, sizeof(path), &pathstrlen);
关于c++ - 如何使用 ODBC (C++) 从 MS SQL 获取 nvarchar 作为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735665/