2009-08-11 4 views
0

Wie führe ich diesen T-SQL-Befehl durch eine C# -Methode aus, damit ich die nächste ID einer Tabelle bekommen kann? GetNextID() - Methode in C#

declare @IDColumnName as varchar(150) 
declare @TableName as varchar(150) 
declare @SQL as nvarchar(1000) 
declare @returns as int 

set @IDColumnName = 'ID' 
set @TableName = 'User' 
set @returns = -1 

set @SQL = 'select MAX([' + @IDColumnName + ']) from [' + @TableName + ']' 
--print @SQL 

EXEC @returns = sp_executesql @SQL 

--print @returns 

Antwort

3

Beachten Sie, dass dies ist eine eklatante Race-Bedingung, wenn Sie eine Schlüssel-Bereichssperre nehmen. Warum nicht IDENTITY verwenden? Aber wenn Sie den Wert SELECT verwenden, sollten Sie in der Lage sein, verwenden Sie ExecuteScalar. Auch

; Wenn Sie die Tabellen nicht auf die weiße Liste setzen, ist das ein SQL-Injektionsrisiko.

+0

Wie kann ich dieses Problem lösen, ohne Identität zu verwenden? –

+0

Verwenden Sie eine serialisierbare Transaktion, und akzeptieren Sie die Blockierung. Sonst noch etwas und du hast eine Race-Condition. Identität ist viel billiger. –

0

bessere Identität zu verwenden, um andere UDF erstellen und den Code in diesem UDF setzen und sie aufrufen, indem ExecuteScalar Methode.