【发布时间】:2012-10-12 18:59:34
【问题描述】:
我的存储过程应该返回我新创建的行的标识,但事实并非如此。
存储过程语法(简而言之):
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 中执行该过程时,这将按预期工作——插入一个新行并返回其标识。但是,当我从我的网络应用程序执行时,使用下面的代码,我得到一个错误。
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()
【问题讨论】:
标签: asp.net sql-server stored-procedures