2011-12-26 129 views
2

我的存儲過程是: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; 
    } 
} 

我在做什麼錯?

回答

8

看起來您正在使用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 

如果您使用的輸出參數,必須指定它是一個當你調用存儲過程。調用存儲過程後,該參數將填充存儲過程中設置的值。

+0

即時對不起,你可以詳細說明一下。我是初學者 – 2011-12-26 07:36:09

+0

@I__ - 查看我更新的例子。 – 2011-12-26 07:41:07

+0

謝謝您的幫助! – 2011-12-26 07:44:50