0

我下载了一个用 C++ 编写的小示例程序,它打开与 SQL Server 的 ODBC 连接、发出查询并打印结果。

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

如果我直接在 SQL Management Studio 中执行等效查询,它就可以工作。

这是代码。请注意,为了简短起见,我已经删除了我没有遇到问题的地方的错误检查。真正的连接字符串被混淆了。

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 的东西?

4

1 回答 1

1

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

SQL_C_CHAR与 不兼容,SQLWCHAR因此您的绑定无法正常工作-它使用的是指向双字节宽字符的指针,并且生成的“C-string”不是您所期望的。

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

SQLCHAR *searchname = "Yuk%";
于 2012-08-14T04:51:35.903 回答