我在C++中下载了一个小示例程序,该程序打开到Server的ODBC连接,发出查询并打印结果。
当查询字符串包含一个参数而我调用SQLBindParameter时,查询执行将返回SQL_SUCCESS,但随后无法获得任何记录。
如果我直接在中执行等效的查询,它就能工作。
这是密码。请注意,为了保持短,我删除了错误检查,在我没有问题的地方。真正的连接字符串被混淆了。
SQLHANDLE sqlenvhandle = 0;
SQLHANDLE sqlconnectionhandle = 0;
SQLHANDLE sqlstatementhandle = 0;
SQLHANDLE sqlstatementhandle2 = 0;
SQLRETURN retcode = 0;
SQLWCHAR retconstring[1024];
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle);
retcode = SQLSetEnvAttr(sqlenvhandle,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle);
retcode = SQLDriverConnect(sqlconnectionhandle, NULL, (SQLWCHAR*)_T("--connectionstring--"),
SQL_NTS, retconstring, 1024, NULL, SQL_DRIVER_NOPROMPT);
retcode = SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle2);
SQLWCHAR *query = _T("SELECT * FROM gbm_models WHERE stagename like ?");
SQLWCHAR *searchname = _T("Yuk%\0");
retcode = SQLPrepare (sqlstatementhandle2, query, SQL_NTS);
SQLINTEGER xxx = SQL_NTS;
retcode = SQLBindParameter( sqlstatementhandle2, 1, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_VARCHAR, 5, 0, searchname, 0, &xxx );
SQLWCHAR sqlbuffer[400];
SQLINTEGER buflen = 0;
retcode = SQLExecute (sqlstatementhandle2);
char name[512];
int id;
while(SQLFetch(sqlstatementhandle2) == SQL_SUCCESS)
{
SQLGetData(sqlstatementhandle2, 1, SQL_C_ULONG, &id, 0, NULL);
SQLGetData(sqlstatementhandle2, 4, SQL_C_CHAR, name, 500, NULL);
cout << id << " " << name << endl;
}
SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle2 );
SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle );
SQLDisconnect(sqlconnectionhandle);
SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);
SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle);这些调用都不返回错误。对SQLFetch的调用将返回SQL_NO_DATA。如果我替换了"?“在带有实际名称字符串的初始查询字符串中,并注释掉SQLBindParameter调用,它可以很好地工作并检索预期的数据。因此很明显,搜索字符串没有正确地进入查询。
有什么好主意吗?有人知道用参数替换获得处理的查询字符串的方法吗?我认为SQLNativeSql函数做到了这一点,但是当我调用它时,我只返回原来的查询,所以我不确定它是否正常工作。会不会是Unicode的事?
发布于 2012-08-14 04:51:35
参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms714556(v=vs.85).aspx中的数据类型
SQL_C_CHAR与SQLWCHAR不兼容,所以绑定无法完成正确的工作--它使用指向双字节宽字符的指针,由此产生的"C-string“不是您所期望的那样。
使用兼容的数据类型,在您的情况下,只需:
SQLCHAR *searchname = "Yuk%";https://stackoverflow.com/questions/11945701
复制相似问题