SQLGetDiagField returns SQL_SUCCESS 但 DiagInfoPtr 的结果是 -1
SQLGetDiagField returns SQL_SUCCESS but result in DiagInfoPtr is -1
我在 MS SQL 中使用 ODBC。使用 SQLExecute(hSTMT) 执行查询时,我尝试使用
接收总行数
SQLGetDiagField(SQL_HANDLE_STMT, hSTMT, 0, SQL_DIAG_CURSOR_ROW_COUNT, &RowCount, SQL_IS_INTEGER, &StrLen);
并且在执行类似
的查询时,我在 RowCount 中收到值 -1
SELECT Username, Password
FROM dbUser with(nolock)
WHERE Username LIKE ?
ORDER BY UserName ASC
虽然SQL执行后的结果是绝对有效的。
当我执行 ORDER BY FullName 时,我收到有效的行数。
此外,当我在本地 运行 时,我也收到有效的行数,但在生产服务器上我收到 -1。我读过这可能是性能问题,但即使只查询 运行ning.
我也有相同的结果
通过尝试查询的不同变体,我发现只有当我使用 'User%'(UserName, UserId, etc.) 之类的字段名称作为 order by 子句的第一个参数时,问题才会出现。适用于 ORDER BY FullName, UserName.
出现这种行为的原因可能是什么?为什么问题只出现在 User% like names 中?
会不会是ODBC驱动的问题?
提前致谢。
根据 msdn,此 header 字段中可能没有确切的行数。请参阅 SQLGetInfo,SQL_CA2_CRC_EXACT,...近似值。
可能需要 SQLFetch 来计算行数。
看来问题出在索引上。当我删除相应列的索引时 - 一切都开始正常工作。虽然没有索引一切都很慢,所以这是一个糟糕的决定。
P.S。索引阻止使用 SQLGetDiagField 用来获取行数的 TempDB。
我在 MS SQL 中使用 ODBC。使用 SQLExecute(hSTMT) 执行查询时,我尝试使用
接收总行数 SQLGetDiagField(SQL_HANDLE_STMT, hSTMT, 0, SQL_DIAG_CURSOR_ROW_COUNT, &RowCount, SQL_IS_INTEGER, &StrLen);
并且在执行类似
的查询时,我在 RowCount 中收到值 -1SELECT Username, Password
FROM dbUser with(nolock)
WHERE Username LIKE ?
ORDER BY UserName ASC
虽然SQL执行后的结果是绝对有效的。
当我执行 ORDER BY FullName 时,我收到有效的行数。
此外,当我在本地 运行 时,我也收到有效的行数,但在生产服务器上我收到 -1。我读过这可能是性能问题,但即使只查询 运行ning.
我也有相同的结果通过尝试查询的不同变体,我发现只有当我使用 'User%'(UserName, UserId, etc.) 之类的字段名称作为 order by 子句的第一个参数时,问题才会出现。适用于 ORDER BY FullName, UserName.
出现这种行为的原因可能是什么?为什么问题只出现在 User% like names 中?
会不会是ODBC驱动的问题?
提前致谢。
根据 msdn,此 header 字段中可能没有确切的行数。请参阅 SQLGetInfo,SQL_CA2_CRC_EXACT,...近似值。 可能需要 SQLFetch 来计算行数。
看来问题出在索引上。当我删除相应列的索引时 - 一切都开始正常工作。虽然没有索引一切都很慢,所以这是一个糟糕的决定。
P.S。索引阻止使用 SQLGetDiagField 用来获取行数的 TempDB。