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

时间:2012-08-14 04:14:00

标签: visual-c++ odbc

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

1 个答案:

答案 0 :(得分:1)

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

上的数据类型

SQL_C_CHARSQLWCHAR不兼容,因此您的绑定无法正常工作 - 它使用指向双字节宽字符的指针,而得到的“C字符串”不是什么你期待它。

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

SQLCHAR *searchname = "Yuk%";