我想从我的SQL数据库中提取一个字符串,但由于某种原因,我的参数是错误的,我不知道为什么。这里是我的代码:如何使用ODBC(C++)作为字符串从MS SQL获取nvarchar?
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'
在此先感谢任何人谁可以在此线索。我一整天都在拉我的头发。
非常感谢您提供的信息丰富且准确的答案。非常感谢! –
我不确定你是正确的“如果你使用Unicode,你需要使用一个宽字符串”,然后编辑。即使您使用为ODBC定义的unicode构建应用程序,也应该能够将SQL_VARCHAR传递给SQLBindParameter,并且驱动程序应该返回给您一个ansi字符串。此外,传递SQL_WVARCHAR但提供一个char路径[401]仍然会在路径中放置较宽的chrs而不是ansi chrs。 – bohica