我的存儲過程應該返回我新創建的行的標識,但它不是。使用SCOPE_IDENTITY和ADO.NET參數化查詢的SQL Server存儲過程
存儲過程語法(簡單地說):
Alter Procedure dbo.udsp_insert_record
@record_title VARCHAR(100)
AS
BEGIN
INSERT INTO tbl_records (RecordTitle) VALUES (@record_title)
SELECT SCOPE_IDENTITY()
END
這是當我執行在SQL Server Management Studio中的程序預期工作 - 一個新的行插入,並返回其身份。但是,當我從我的web應用程序執行時,使用下面的代碼,我得到一個錯誤。
dim obj_command as New SqlCommand("udsp_insert_record",obj_connection)
obj_command.CommandType = CommandType.StoredProcedure
obj_command.Parameters.Add("@record_title",SqlDbType.VarChar).Value = "just testing"
dim n_new_record_id as Integer = obj_command.ExecuteScalar()
obj_command.Dispose() 'etc., etc.
在運行此,我得到的錯誤
輸入字符串沒有在與
ExecuteScalar
命令行了正確的格式
。
我的解釋是,SQL Server沒有返回一個整數值 - 它必須返回一個對象或DBNull
或其他東西。
但這是爲什麼呢? INSERT
和SELECT SCOPE_IDENTITY()
發生在相同的範圍內,所以SQL Server回傳的身份值必須有效(通過我通過SQL Server Management Studio進行的測試證實)。
我以爲我讀了一些地方,當你使用ADO.NET與SQL Server存儲過程交談的參數化查詢時,範圍不是你期望的範圍,因爲它實際上使用另一個存儲過程來執行一個你要求。這有什麼好處?
任何想法?
編輯:使用SELECT CAST(SCOPE_IDENTITY() AS INT)
也不起作用。另外:即使我沒有將ExecuteScalar的結果賦值爲Integer值,我也會得到這個錯誤 - 即使我只是做了同樣的錯誤response.write obj_command.ExecuteScalar()
改變你的代碼來檢查'nulls'或使用'Int32.TryParse',你的答案是不是比OP不同(原海報)做 –
誰是OP在這裏? –