C++ ODBC调用SQL Server存储过程执行SQLFetch报错无法获取查询结果
问题原因分析
- 核心原因:SQL Server 默认会返回 DML 语句的影响行数作为结果,你的存储过程先执行 INSERT 语句,执行成功后第一个返回的结果是 INSERT 的行数计数(非行集结果),你在
SQLExecute执行完成后直接调用SQLFetch,尝试读取非行集的计数结果,自然会返回 SQL_ERROR。
两种解决方式:- 调用
SQLFetch之前先执行SQLMoreResults(sqlStmtHandle),跳过 INSERT 的行数计数结果,定位到后续 SELECT 语句返回的行集结果,再调用SQLFetch即可正常读取数据。 - 在存储过程的
BEGIN后第一行添加SET NOCOUNT ON;,关闭 DML 语句的行数计数返回,存储过程执行后只会返回 SELECT 的行集结果,不需要跳转结果集就能直接调用SQLFetch。
- 调用
- 潜在兼容问题:第二个参数的绑定类型和变量类型不匹配,你定义的
nAge是有符号的SQLINTEGER类型,但绑定时传入的 C 类型是SQL_C_ULONG(无符号长整型),虽然本次插入未触发异常,但传入负数时会出现数据错误,建议将第二个参数的 C 类型改为SQL_C_LONG保持匹配。 - 排查建议:如果调整后仍报错,可以调用
SQLGetDiagRec接口获取 ODBC 具体错误描述,可精准定位问题点。
内容的提问来源于stack exchange,提问作者black4joss
相关产品推荐
相关产品推荐

