【问题标题】:Transaction in SP avoid correct answerSP中的事务避免正确答案
【发布时间】:2012-08-16 23:59:40
【问题描述】:

我有一个从 SSMS 调用时运行良好的 SP。但是当我从我的应用程序中调用它时 用C++编写,使用ODBC连接数据库,操作不返回错误,但实际上在数据库中什么都不做。

我的 SP 从一些临时表中读取一些值,然后将它们插入数据库或更新它们。

我在 SP 中有一个事务来保护 SP 的所有代码,我几乎不调试我的 SP 并发现该函数将在第一次插入或更新时返回,所以什么也不做。所以我删除了部分工作的事务和功能,我的意思是它添加了一些项目,但将其中一些项目留在那里而不将它们添加到数据库中。 这是我的 SP 的骨架:

--开始交易 声明@id bigint,@name nvarchar(50) 从 MyTable 中删除而不是(id IN(从 #MyTable 中选择 id)) DECLARE cur1 CURSOR FOR SELECT id, name FROM #MyTable 打开 cur1 而 1 != 0 开始 将 cur1 提取到 @id、@name IF @@FETCH_STATUS != 0 中断; UPDATE MyTable SET [Name]=@name WHERE [id]=@id 如果@@ROWCOUNT = 0 插入 MyTable (ID, Name) 值 (@id, @name) 结尾 关闭 cur1 释放 cur1 --提交交易

【问题讨论】:

  • 添加了 sql 和存储过程标签。

标签: c++ sql sql-server stored-procedures odbc


【解决方案1】:

我通过在我的 SP 的开头添加SET NOCOUNT ON 来解决我的问题,所以我认为当 SQL 由于执行我的 SQL 返回多个结果集时,ODBC 在收到第一个结果集时关闭或取消命令。

【讨论】:

    【解决方案2】:

    您是否有可能在 ODBC 中启动了一个需要显式 COMMIT 才能结束的隐式事务(在调用 SP 之后)? SSMS 一般使用自动提交模式。

    【讨论】:

    • 不,我确定我的 ODBC 连接处于自动提交模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2018-06-28
    相关资源
    最近更新 更多