1

(解決済み: 下部を参照)

次のコード スニペットがあります。

Protected Sub SqlDataSource1_Inserted(ByVal sender As Object, 
ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs)
Handles SqlDataSource1.Inserted
    affected = CInt(DirectCast(e.Command.Parameters("@affected"), IDbDataParameter).Value)
    newID = CInt(DirectCast(e.Command.Parameters("@newID"), IDbDataParameter).Value)
End Sub

@newID は、SQL 文字列で次のように定義されます。

"INSERT INTO x(a,b,c) VALUES (@a,@b,@c); SELECT @affected = @@rowcount, @newID = SCOPE_IDENTITY();

パラメータは、ASP.NET を使用して次のように定義されます。

奇妙なことに、これは 90% の確率で機能しますが、「'DBNull' 型から 'Integer' 型への変換は無効です」という InvalidCastException が時々スローされます。この値が null になる原因について何か考えはありますか? テーブルにトリガーを設定しておらず、クエリが実行しているのは、1 つのテーブルへの単純な挿入を実行することだけです。

編集:ここでの提案に基づいて、affectedパラメーターを追加しました。ブレークポイントを設定し、影響を受けました = 1 でしたが、それでも例外が発生しました。しかし、その後、SELECT @affected の前に SELECT @newID を使用していることに気付きました。順序を入れ替えたところ、@affected = 0 になりました。結局、insert ステートメントに問題があるようです。ご協力いただきありがとうございます!

4

7 に答える 7

8

MSDNから

INSERT、SELECT INTO、または一括コピー ステートメントが完了すると、@@IDENTITY には、ステートメントによって生成された最後の ID 値が含まれます。ステートメントが ID 列を持つテーブルに影響を与えなかった場合、@@IDENTITY は NULL を返します。

挿入が成功したかどうかを確認するためのチェックはありますか? 挿入しようとしているレコードが何らかの理由で何も挿入できず、ID が null である可能性があります。

テーブルにトリガーが設定されていますか? @@IDENTITY を使用して、トリガー プロシージャから ID を取得している可能性があります。

SCOPE_IDENTITY()または出力パラメーターを使用して ID を取得することをお勧めします

于 2009-01-10T23:36:14.423 に答える
4

99.9% のケースでSCOPE_IDENTITY()to とは対照的に使用する必要があります。@@IDENTITYそれ以外の何かが必要な状況になることは非常にまれですSCOPE_IDENTITY()

@@IDENTITY値を生成したテーブルや、値を生成したステートメントのスコープに関係なく、接続で生成された最後の IDENTITY 値を返します。ID を別のテーブルに作成させるトリガーがテーブルにある場合、ID を作成したのがトリガーであっても、最後に作成された ID が取得されます。

SCOPE_IDENTITY()値を生成したテーブルに関係なく、接続および同じスコープ内のステートメントによって生成された最後の IDENTITY 値を返します。SCOPE_IDENTITY() は、@@IDENTITY と同様に、現在のセッションで作成された最後の ID 値を返しますが、現在のスコープにも制限されます。

そのテーブルには監査トリガーがありませんか (おそらく DBA によって追加されたもの)?

于 2009-01-11T00:19:01.297 に答える
2

さまざまな可能性:

  • INSERT は何も挿入しません (エリッカレンが言ったように)

  • あなたのステートメント(表示されていません)はさまざまなテーブルに挿入されますが、最後のテーブルにはID列がありません

  • INSERT は、ID 列のないテーブルに挿入するトリガーを起動します - 代わりに SCOPE_IDENTITY() を試してください

于 2009-01-10T23:31:46.900 に答える
1

これが発生した別の時間、変更

<asp:Parameter Name="newID" Direction="Output" Size="4" />

<asp:Parameter Name="newID" Direction="Output" Type="Int32" Size="4" />

私の問題を修正しました。私のホストは、より明示的な宣言のためにいくつかの要件をオンにしたようです。

于 2010-01-05T02:52:23.467 に答える
1

@@ROWCOUNT > 0 かどうかを確認するためにチェックを実行することをお勧めします。

また、過去のバージョンの SQL Server には、トリガーが @@IDENTITY の存続可能性に影響を与える既知の問題がありました。きっかけはありますか?

于 2009-01-10T23:41:24.633 に答える
0

SCOPE_IDENTITY() および @@IDENTITY を使用すると、誤った値を受け取る場合があります。具体的には、クエリが並列クエリとして実行される場合:

http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779

于 2011-03-29T11:58:35.767 に答える
0

部品は何query text... ですか?INSERT だと思います。insert ... select行が見つからなかったのですか?

于 2009-01-10T23:25:32.030 に答える