SP中的交易避免正确答案

时间:2012-08-21 15:28:32

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

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

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

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

--BEGIN TRANSACTION
DECLARE @id bigint, @name nvarchar(50)
DELETE FROM MyTable WHERE NOT( id IN (SELECT id from #MyTable) )
DECLARE cur1 CURSOR FOR SELECT id, name FROM #MyTable
OPEN cur1
WHILE 1 != 0
BEGIN
    FETCH cur1 INTO @id, @name
    IF @@FETCH_STATUS != 0 BREAK;

    UPDATE MyTable SET [Name]=@name WHERE [id]=@id
    IF @@ROWCOUNT = 0
        INSERT INTO MyTable ( ID, Name ) VALUES ( @id, @name )
END
CLOSE cur1
DEALLOCATE cur1
--COMMIT TRANSACTION

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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