我有一个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
答案 0 :(得分:0)
是否有可能在ODBC中启动一个需要显式COMMIT结束的隐式事务(在调用SP之后)? SSMS通常使用自动提交模式。
答案 1 :(得分:0)
我通过添加SET NOCOUNT ON
来启动我的SP来解决我的问题,所以我认为当SQL在执行我的SQL时返回多个结果集时,ODBC会在收到第一个结果集时关闭或取消命令。 / p>