ODBC,SQL_SUCCESS_WITH_INFO,游标类型已更改 - 发生在具有单个 SELECT 的存储过程上

ODBC, SQL_SUCCESS_WITH_INFO, Cursor type changed - happening on a Stored Procedure with a single SELECT

本文关键字:单个 存储过程 SELECT INFO WITH SUCCESS SQL 游标 类型 ODBC      更新时间:2023-10-16

我想知道是否有其他人遇到过这个问题以及他们如何解决它?

我们的应用程序进行以下 ODBC 调用:

CString strCmd = "sprTestSingleSelect";
rc = SQLExecDirect(hstmt, (UCHAR*)(LPCSTR)strCmd, SQL_NTS);

呼叫重新运行SQL_SUCCESS_WITH_INFO。通过检查SQLGetDiagRec我们会看到消息;光标类型已更改。

我们找到了来自Micrsoft的以下文章;

  1. http://support.microsoft.com/kb/156500/en-us
  2. http://msdn.microsoft.com/library/ms130807.aspx

存储过程 sprTestSingleSelect 是专门为测试两篇文章所暗示的内容而创建的 - 多个选择会导致更改。

CREATE PROCEDURE sprTestSingleSelect
AS
BEGIN
SET NOCOUNT ON;
SELECT id, firstname, lastname FROM address
END
GO

但是,即使使用这个非常简单的(单个 SELECT(存储过程,游标类型仍在更改(从 SQL_CURSOR_KEYSET_DRIVEN 更改为 SQL_CURSOR_FORWARD_ONLY (。

我们需要游标类型以保持在 SQL_CURSOR_KEYSET_DRIVEN ,就像稍后在应用程序中我们调用 SQLFetchScroll(hstmt, SQL_FETCH_LAST, 0); 一样,由于游标类型不正确而下降。

有没有人知道我们可能做错了什么或出了什么问题?

我们正在使用 MS SQL Server 2008R2

我们的应用程序是用C++编写的(使用Visual Studio 10 Premium(

我们已经设法使上述测试正常工作,但是解决方案不是很令人满意。

当存储过程包含一个 SELECT 语句而不包含任何其他语句时,它不起作用。因此,要使其正常工作,我们所要做的就是删除语句SET NOCOUNT ON;。作为旁注,我们测试了将 NOCOUNT 设置为 OFF 也不起作用 - 完全删除语句是必需的。

这似乎使得使用存储过程返回数据(结果集(变得相当无用!

如果有人有其他(更好的(解决方案,我们很乐意听到它......