0

SSMSから呼び出されたときに非常にうまく機能するSPがあります。しかし、ネイティブC ++で記述されたアプリケーションから呼び出し、ODBCを使用してデータベースに接続すると、操作はエラーを返しませんが、実際にはデータベースでは何もしません。

私のSPは、いくつかの一時テーブルからいくつかの値を読み取り、それらをデータベースに挿入するか、更新します。

SPのすべてのコードを保護するトランザクションがSPにありましたが、SPをデバッグすることはほとんどなく、関数が最初の挿入または更新で返されるため、何もしません。したがって、そのトランザクションと機能を部分的に削除します。つまり、いくつかのアイテムを追加しますが、データベースに追加せずにいくつかのアイテムをそのままにしておきます。これが私のSPのスケルトンです:

--トランザクションの開始
DECLARE @id bigint、@ name nvarchar(50)
DELETE FROM MyTable WHERE NOT(id IN(SELECT id from #MyTable))
SELECT id、nameFROM#MyTableのcur1カーソルを宣言します
OPEN cur1
WHILE 1!= 0
始める
    FETCH cur1 INTO @ id、@ name
    IF @@ FETCH_STATUS!= 0 BREAK;

    UPDATE MyTable SET [Name] = @ name WHERE [id] = @ id
    @@ ROWCOUNT=0の場合
        INSERT INTO MyTable(ID、Name)VALUES(@id、@name)
終わり
cur1を閉じる
cur1の割り当てを解除する
-トランザクションのコミット
4

2 に答える 2

0

SPの先頭に追加することで問題を解決しているSET NOCOUNT ONので、SQLを実行した結果としてSQLが複数の結果セットを返す場合、ODBCは最初の結果セットを受け取ったときにコマンドを閉じるかキャンセルします。

于 2012-10-02T20:45:01.853 に答える
0

(SPの呼び出し後に)終了するために明示的なCOMMITを必要とするODBCで暗黙のトランザクションを開始することは可能ですか?SSMSは通常、自動コミットモードを使用します。

于 2012-08-21T16:15:08.637 に答える