2012-10-24 23 views
3

我有一个在Windows Server 2003和SQL Server 2000上运行多年的系统没有问题。最近我将系统移至Windows Server 2008 R2和SQL Server 2008 R2,并开始出现非常奇怪的间歇性问题。SCOPE_IDENTITY回读

我将一行插入到具有标识列的表中,并执行select以检索标识值。大多数情况下,这段代码可以正常工作,但是在随机间隔内,不会返回标识。有时候没有行被找到,因此dr.Read返回false,其他时候我得到一个行,但是没有标识列。我检查了数据库并且插入成功了,只是没有返回标识。桌子上没有触发器。

我也试图改变SQL语句:

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

的情况下,我跑入'max degree of parallelism'错误,但没有任何帮助。

下面是相关的代码(略微简化的图示):

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 

回答

0

如果你简单地执行它们作为两个单独的语句?

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

SCOPE_IDENTITY给你“插入在同一范围内的标识列的最后一个标识值。”

0

SQL Server 2008上的另一种选择R2将使用OUTPUT clause

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

这将输出已插入该行的ID - 这就是你想要的标识值。

从你的代码,你应该能够获取(而不是ExecuteReader)是ID如果使用ExecuteScalar,只是转换object类型,然后再回到一个int