首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让SQLBindParameter在C++中工作的问题

让SQLBindParameter在C++中工作的问题
EN

Stack Overflow用户
提问于 2012-08-14 04:14:00
回答 1查看 4.3K关注 0票数 0

我在C++中下载了一个小示例程序,该程序打开到Server的ODBC连接,发出查询并打印结果。

当查询字符串包含一个参数而我调用SQLBindParameter时,查询执行将返回SQL_SUCCESS,但随后无法获得任何记录。

如果我直接在中执行等效的查询,它就能工作。

这是密码。请注意,为了保持,我删除了错误检查,在我没有问题的地方。真正的连接字符串被混淆了。

代码语言:javascript
复制
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的事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-14 04:51:35

参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms714556(v=vs.85).aspx中的数据类型

SQL_C_CHARSQLWCHAR不兼容,所以绑定无法完成正确的工作--它使用指向双字节宽字符的指针,由此产生的"C-string“不是您所期望的那样。

使用兼容的数据类型,在您的情况下,只需:

代码语言:javascript
复制
SQLCHAR *searchname = "Yuk%";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11945701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档