2017-04-20 62 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