2
Set rs = command.Execute 
if not rs.EOF then
   'logic here
end if

上記のコードは 2 行目で失敗します。これは、rs が閉じられているためです (おそらく oledb プロバイダーは、それが挿入コマンドであるため、何も返す必要がないことを誤って認識しました)。コマンドは、次のような挿入ステートメントです。

Insert into log(Name,Value) values("xxx", 123); select scope_identity()

1 回の往復でサーバーから ID が返される必要があります。何か案は?

PS: フィールド名を使用して挿入ステートメントを更新しました (Eduardo に感謝) が、それは問題ではありません。

4

4 に答える 4

6

問題は、データ ソースが 2 つのレコードセットを返すことです。これは、データベースの NOCOUNT 設定によるものです。最初のレコードセットは、insert ステートメントの影響を受けるレコードを返すためだけに使用されます。2 番目のレコードセットは、SELECT SCOPE_IDENTITY 呼び出しの結果を返します。したがって、次のことを行う必要があります。

If rs.State = adStateClosed Then
   Set rs = rs.NextRecordset()
End If

次に、EOF とそのすべてを確認できます。しかし、私は通常、これをすべて回避し、このようなものをストアド プロシージャに入れます。次に、ストアド プロシージャで NOCOUNT ON を設定します。ストアド プロシージャの最後に ID を返します。今のところ、挿入はそのように単純かもしれませんが、ロジックは拡大する可能性があります。ストアド プロシージャに配置することで、ストアド プロシージャを変更するだけで、コンパイル済みの VB アプリを変更する必要がなくなります。また、データベース コードを少し分離します。

あなたがしたくないのは、そこのステートメントで SET NOCOUNT ON です。データベース全体ではないにしても、接続全体に影響すると思います。

于 2009-04-07T13:59:03.987 に答える
1

これは SQL Server ですか? SET NOCOUNT ONたとえば、SQLの先頭に追加してみてください

SET NOCOUNT ON;
Insert into log(Name,Value) values("xxx", 123); 
select scope_identity()
于 2009-04-07T13:57:32.557 に答える
1

@@Identity From TableName を選択すると、最後に挿入された ID が返されます

于 2009-04-07T12:01:58.980 に答える
0

関数で ID を返すことができます。

CREATE FUNCTION dbo.MyFunc ( @name varchar(10), @value varchar(10))
RETURNS int
AS
BEGIN
    DECLARE @rtn int

    Insert into log(Name,Value) 
    values("xxx", 123); 

    select @rtn = scope_identity()
    RETURN @rtn;
END

私はあなたが上記のものを持っていると思いますが、挿入を行ってから選択すると、何らかの方法で機能するはずです。

于 2009-04-07T13:35:37.990 に答える