1

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

我们的应用程序进行以下 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_DRIVENSQL_CURSOR_FORWARD_ONLY)。

我们需要将光标类型停留在SQL_CURSOR_KEYSET_DRIVEN,稍后在我们正在调用的应用程序中SQLFetchScroll(hstmt, SQL_FETCH_LAST, 0);,由于光标类型不正确,它正在下降。

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

我们正在使用 MS SQL Server 2008R2

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

4

1 回答 1

1

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

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

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

如果有人有另一个(更好的)解决方案,我们很乐意听到它......

于 2013-07-19T08:50:00.037 回答