SCOPE_IDENTITY()始终返回0

我的存储过程是:

ALTER PROCEDURE [dbo].[Insert_QuickLabDump] @Specimen_ID [varchar](50), @Client_Key int, @Outcome [varchar](50), @Medications [varchar] (max), @Date_Collected date, @Time_Collected time(0) , @Date_Entered date, @Time_Entered time(0) , @Date_Completed date, @Time_Completed time(0) , @Test_Date date , @Test_Time time(0) , @Practice_Name [varchar] (500), @Practice_Code [varchar] (500), @Client_ID [varchar] (500), @Requesting_Physician [varchar] (500), @Other_Medications [varchar] (max), @Order_Comments [varchar] (max), @Reference_Number [varchar] (500), @Order_Count int, @lastrecord INT OUTPUT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; INSERT INTO [SalesDWH].[dbo].[QuickLabDump] ([Specimen ID] ,[Client Key] ,[Outcome] ,[Medications] ,[Date Collected], [Time Collected] ,[Date Entered] , [Time Entered] , [Date Completed] , [Time Completed] , [Test Date] , [Test Time] , [Practice Name] ,[Practice Code] ,[Client ID] ,[Requesting Physician] ,[Other Medications] ,[Order Comments] ,[Reference Number] ,[Order Count]) VALUES (@Specimen_ID, @Client_Key, @Outcome, @Medications, @Date_Collected , @Time_Collected , @Date_Entered, @Time_Entered , @Date_Completed , @Time_Completed, @Test_Date , @Test_Time, @Practice_Name, @Practice_Code, @Client_ID, @Requesting_Physician, @Other_Medications, @Order_Comments, @Reference_Number, @Order_Count ); select @lastrecord = scope_identity(); END 

由于某种原因,它每次都返回0。

我正在执行它:

 public static int Insert_QuickLabDump(QuickLabDump dump) { try { DbConnection cn = GetConnection2(); cn.Open(); // stored procedure DbCommand cmd = GetStoredProcCommand(cn, "Insert_QuickLabDump"); DbParameter param; param = CreateInParameter("Specimen_ID", DbType.String); param.Value = dump.Specimen_ID; cmd.Parameters.Add(param); ..... (lots more parameters - same method) ...... param = CreateOutParameter("lastrecord", DbType.Int32); cmd.Parameters.Add(param); // execute int id=cmd.ExecuteScalar().ToInt(); return id; if (cn.State == ConnectionState.Open) cn.Close(); } catch (Exception e) { throw e; } } 

我究竟做错了什么?

看起来您正在使用ExecuteScalar()而不是查看输出参数来获取标识。 在执行后查看输出参数的值,或者选择SCOPE_IDENTITY()作为查询的结果。

这是一个应该与ExecuteScalar()一起使用的快速示例:

 CREATE PROCEDURE dbo.QuickExample @Name VARCHAR( 50 ) AS INSERT INTO dbo.MyTable( Name ) VALUES( @Name ); SELECT SCOPE_IDENTITY(); GO 

以下是如何使用输出参数创建存储过程:

 CREATE PROCEDURE dbo.QuickExample @Name VARCHAR( 50 ), @Id INT OUTPUT AS INSERT INTO dbo.MyTable( Name ) VALUES( @Name ); SET @Id = SCOPE_IDENTITY(); GO 

如果使用输出参数,则必须在调用存储过程时将其指定为一个参数。 调用存储过程后,将使用存储过程中设置的值填充该参数。