Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 在C++中获取SqLbDin参数的问题 下载了一个C++中的小程序,打开了一个ODBC连接到SQL Server,发出查询,打印结果。_Visual C++_Odbc - Fatal编程技术网

Visual c++ 在C++中获取SqLbDin参数的问题 下载了一个C++中的小程序,打开了一个ODBC连接到SQL Server,发出查询,打印结果。

Visual c++ 在C++中获取SqLbDin参数的问题 下载了一个C++中的小程序,打开了一个ODBC连接到SQL Server,发出查询,打印结果。,visual-c++,odbc,Visual C++,Odbc,当查询字符串包含一个参数并且我调用SQLBindParameter时,查询执行返回SQLU SUCCESS,但随后无法获取任何记录 如果我直接在SQLManagementStudio中执行相同的查询,它就会工作 这是密码。请注意,为了保持简短,我已经删除了一些我没有遇到问题的地方的错误检查。真正的连接字符串被混淆了 SQLHANDLE sqlenvhandle = 0; SQLHANDLE sqlconnectionhandle = 0; SQLHANDLE sqlstatementha

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

如果我直接在SQLManagementStudio中执行相同的查询,它就会工作

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

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\u NO\u数据。如果我换新的?在具有实际名称字符串的初始查询字符串中,并注释掉SQLBindParameter调用,它工作正常并检索预期数据。很明显,搜索字符串没有正确地进入查询

你知道怎么了吗?有人知道在完成参数替换的情况下获取已处理查询字符串的方法吗?我认为SQLNativeSql函数可以做到这一点,但当我调用它时,我只是返回原始查询,所以我不确定它是否正常工作。这可能是Unicode吗?

请参阅

SQL_C_CHAR与SQLWCHAR不兼容,因此绑定无法完成正确的工作-它使用指向双字节字符的指针,而生成的C字符串不是您所期望的

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

SQLCHAR *searchname = "Yuk%";

在完成参数替换的情况下获取已处理的查询字符串-您会感到困惑。SQL数据绑定与参数替换完全无关。至于你的实际问题——对不起,我没有足够的信息。也许可以查看数据库服务器日志,看看正在执行什么以及使用什么参数?刚刚注意到。。。SQLWCHAR*searchname在绑定时指定数据类型为SQL\u C\u CHAR。这两种类型是否兼容?@yephlck-谢谢您的回复。也许我不清楚,但我并不困惑绑定参数的作用。我只是想知道是否有一种方法可以在完成参数替换后查看查询的版本。这将有助于调试。我确实查看了服务器日志,它们显示了没有参数替换的查询。这就是为什么我怀疑SQLBindParameter有问题,即使没有错误。至于SQLWCHAR和SQL_C__CHAR的问题,我不知道。这就是我在这里提问的原因。编译器在使用SQLCHAR时出错。当使用绑定时,您永远看不到扩展的SQL,它在设计中根本不存在。我知道扩展的SQL查询字符串不是正常过程的一部分,但考虑到它在调试中的用处,我不想排除这种可能性。我知道这会帮助我更快地解决这个问题。使用SQLCHAR会使编译器在SQLPrepare上抛出一个错误,在使用Unicode时,它会映射到SQLPrepareW。我越来越确信,问题是围绕着指定正确的数据类型来解决的。。。使用SQLWCHAR作为查询字符串以使SQLPrepare愉快,因此使用SQL_WVARCHAR作为参数类型值,认为它必须与查询字符串匹配。然后,我尝试为非Unicode字符串设置ValueType参数SQL_C_CHAR,或为Unicode字符串设置SQL_C_WCHAR,两者都可以。事实上,只要使用兼容的数据类型,就应该注意Unicode的内容没有很好的文档记录,数据类型常量甚至没有在同一位置定义。烦人的