3

Windows Server 2003 と SQL Server 2000 で何年も問題なく実行されているシステムがあります。最近、システムを Windows Server 2008 R2 および SQL Server 2008 R2 に移行したところ、非常に奇妙な断続的な問題が発生し始めました。

ID 列を持つテーブルに行を挿入し、select を実行して ID 値を取得しています。ほとんどの場合、このコードは問題なく動作しますが、ランダムな間隔で ID が返されません。行が見つからないためdr.Readに false が返されることもあれば、行が返されても ID 列が含まれていないこともあります。データベースを確認したところ、挿入は成功しました。ID が返されなかっただけです。テーブルにトリガーはありません。

また、SQLを次のように変更してみました:

INSERT INTO test (value) 
VALUES (100) 
SELECT SCOPE_IDENTITY() AS 'identity' OPTION (MAXDOP 1) 

「最大並列度」バグに遭遇した場合に備えて、それも役に立ちませんでした。

関連するコードは次のとおりです(説明のために少し簡略化されています):

Dim dr As SqlDataReader = Nothing
Dim objCommand As New SqlCommand
Dim oConn As New SqlConnection
Dim id as integer

oConn.ConnectionString = connStr 
oConn.open()

objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100) SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)

try
    dr = objCommand.ExecuteReader
    If Not dr.Read Then
        Throw (New Exception("Could not read IDENTITY"))
    Else
        id = dr("identity")
    End If
Catch
    Throw
Finally            
    If Not dr Is Nothing Then dr.Close()
    oConn.close()
End Try
4

2 に答える 2

0

それらを 2 つの別個のステートメントとして単純に実行するとどうなるでしょうか。

objCommand = New SqlCommand("INSERT INTO test (value) VALUES (100); SELECT SCOPE_IDENTITY() AS 'identity'", oConn, tr)

SCOPE_IDENTITYは、「同じスコープ内の ID 列に最後に挿入された ID 値」を提供します。

于 2012-10-24T16:27:45.410 に答える
0

SQL Server 2008 R2 の他のオプションは、OUTPUTを使用することです。

INSERT INTO test (value) 
OUTPUT INSERTED.ID
VALUES (100) 

これIDにより、挿入された行の が出力されます。これが必要な ID 値です。

あなたのコードから、 (の代わりに)IDを使用し、取得した型を変換するだけでそれを取得できるはずですExecuteScalarExecuteReaderobjectint

于 2012-10-24T16:56:53.620 に答える