2017-04-20 72 views
0

我有一個SQL Server 2016中的存儲過程,我想從一個ASP.Net核心項目中使用實體框架核心v1.1.1 。我怎樣才能從一個存儲過程調用Database.ExecuteSqlCommand

這裏是我的方法...

private string GetNextSerialNumber(string a_mailerId, string a_serviceTypeCode) 
    { 
     try 
     { 
      var mailerId = new SqlParameter 
      { 
       ParameterName = "@mailerId", 
       SqlDbType = SqlDbType.NVarChar, 
       Direction = ParameterDirection.Input, 
       Size = 9, 
       Value = a_mailerId 
      }; 

      var serviceTypeCode = new SqlParameter 
      { 
       ParameterName = "@serviceTypeCode", 
       SqlDbType = SqlDbType.NVarChar, 
       Direction = ParameterDirection.Input, 
       Size = 4, 
       Value = a_serviceTypeCode 
      }; 

      var serialNumber = new SqlParameter 
      { 
       ParameterName = "@serialNumber", 
       SqlDbType = SqlDbType.NVarChar, 
       Size = 14, 
       Direction = ParameterDirection.Output 
      }; 

      var result = m_mailpieceRoContext.Database.ExecuteSqlCommand(
       "exec GetNextSerialNumber @mailerId, @serviceTypeCode, @serialNumber OUT", mailerId, serviceTypeCode, serialNumber); 


      return result; 

     } 
     catch (Exception ex) 
     { 

      throw; 
     } 

    } 

,這裏是我的存儲過程...

ALTER PROCEDURE [dbo].[GetNextSerialNumber] 
    @mailerId    NVARCHAR(9), 
    @serviceTypeCode  NVARCHAR(4), 
    @serialNumber   NVARCHAR(14) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @counter  BIGINT 
    DECLARE @start_counter BIGINT 
    DECLARE @end_counter BIGINT 
    DECLARE @length   INT 
    DECLARE @tempCounters TABLE 
    (
     current_counter  BIGINT, 
     start_counter  BIGINT, 
     end_counter   BIGINT, 
     [length]   INT 
    ) 

    INSERT INTO 
     @TempCounters 
    SELECT 
     current_counter, 
     start_counter, 
     end_counter, 
     [length] 
    FROM 
     MailerIdCounters 
    WHERE 
     mailer_id = @mailerId 
     AND service_type_code = @serviceTypeCode 
     AND active = 1 


    IF EXISTS (SELECT * FROM @tempCounters) 
    BEGIN 
     SELECT @counter = current_counter FROM @tempCounters 
     SELECT @start_counter = start_counter FROM @tempCounters 
     SELECT @end_counter = end_counter FROM @tempCounters 
     SELECT @length = [length] FROM @tempCounters 
    END 

    IF (@counter + 1) > @end_counter 
     SET @counter = @start_counter 
    ELSE 
     SET @counter = @Counter + 1 

    UPDATE MailerIDCounters 
    SET current_counter = @counter 
    WHERE mailer_id = @mailerId 
    AND service_type_code = @serviceTypeCode 

    SELECT RIGHT('00000000000000'+CAST(@counter AS VARCHAR(14)), @length) 
    SET @serialNumber = @counter 
END 

當我從SSMS 2016上運行我的存儲過程,我得到想要的字符串結果(即0000),但上面列出的GetNextSerialNumber方法的結果值爲-1。

任何想法?

在此先感謝您提供的任何幫助。

回答

2
context.Database.ExecuteSqlCommand(
    "exec GetNextSerialNumber @serialNumber OUT", serialNumber); 

ExecuteSqlCommand僅返回執行結果(它是-1)。要獲得序列號,只需在命令執行後檢查輸出參數值:

var val = serialNumber.Value; 
+0

就是這樣。奇蹟般有效。謝謝 :) – EiEiGuy