【问题标题】:ASP.NET Core Web API: How to implement Stored Procedure output in ADO.NET?ASP.NET Core Web API:如何在 ADO.NET 中实现存储过程输出?
【发布时间】:2022-10-19 23:39:46
【问题描述】:

在 ASP.NET Core 6 Web API 中,我在 Sybase DB 中有这个存储过程。存储过程将用于根据条件附加名称。

存储过程:

CREATE PROCEDURE dbo.sp_employees
    @psAggregatorId varchar(80),
    @psAcctNo       varchar(20),
    @psAppend2Name  varchar(40),   
    @rsErrorText    varchar(255) OUTPUT
AS
    DECLARE 
        @nRC                   int
        ,@nPtid                 numeric(12,0)
        ,@sAcctType             char(2)
        ,@nRimNo                int
        ,@nClassCode            int
        ,@nBranchNo             int
        ,@nRsmId                int
        ,@sOdOption             char(1)
        ,@nEmplId               int
        ,@nChannelId            int
        ,@sTitle1               varchar(60)
        ,@sTitle2               varchar(60)
        ,@sAggregatorName       varchar(200)   
    
    /* Default values */
    SELECT @nEmplId    = 0,
           @nChannelId = 295 
    
    IF EXISTS (SELECT 1 FROM database1..employee_transfer_account 
               WHERE acct_no = @psAcctNo AND renamed = 'Y')
    BEGIN
        SELECT @rsErrorText = @psAcctNo + " has been previously renamed"
        RETURN -2000000
    END
    
    SELECT @sAggregatorName = aggregator_name
    FROM database1..employee_transfer_aggregator
    WHERE aggregator_name = @psAggregatorId
    
    IF @@rowcount = 0
    BEGIN
        SELECT @rsErrorText = "System could not retrieve Merchant record"
        RETURN -2000011      
    END

    SELECT 
        @sAcctType  = acct_type,
        @nRimNo     = rim_no,
        @nClassCode = class_code,
        @nBranchNo  = branch_no,
        @nRsmId     = rsm_id,
        @sOdOption  = od_option,
        @sTitle1    = title_1,
        @sTitle2    = title_2
    FROM 
        database1..dp_acct
    WHERE
        acct_no = @psAcctNo
    
    IF @@rowcount = 0
    BEGIN
        SELECT @rsErrorText = "System could not retrieve record"
        RETURN -2000012      
    END
      
    select @sTitle1  = @sAggregatorName + ' - '
    
    select @sTitle2  = @psAppend2Name   
    
    exec @nRC = sp_tpi_acct
        'Update'              -- @psAction
        ,@nRimNo
        ,@psAcctNo
        ,@sAcctType
        ,@nClassCode
        ,@nBranchNo
        ,@nRsmId
        ,@sTitle1       -- @psTitle1
        ,@sTitle2        -- @psTitle2
        ,@sOdOption
        ,@nEmplId
        ,@nChannelId
        ,@rsErrorText   output
        
    if @nRC != 0 or @@error != 0
    begin
        select @rsErrorText = convert(varchar(20),@nRC) + "|" + @rsErrorText
        return -2000013
    end


   -- Flag account flagged as renamed
    update database1..employee_transfer_account
    set renamed = 'Y'
        ,rename_dt = getdate()
        ,virtual_name = @sTitle1 + ' ' + @sTitle2
    where acct_no = @psAcctNo
    
    if @@rowcount = 0
    begin
        select @rsErrorText = "System could not update managed account record"
        return -2000014      
    end        

return 1

如果成功则显示

@psAcctNo appended successfully with @psAppend2Name

但是如果失败或者重命名='Y',那么它应该显示@rsErrorText的内容。

我已经在我的 ASP.NET Core Web API 中编写了代码。

回复:

public class Response<T>
{
    public bool Success { get; set; }
    public T Data { get; set; }

    public Response(bool success, T data)
    {
        Success = success;
        Data = data;
    }

    public Response()
    {
    }
}

DTO:

public class AppendRequestDto
{
    [Required]
    public string AcctNumber { get; set; }

    [Required]
    public string AppendName { get; set; }
}

服务:

public Response<object> AppendAccount(AppendRequestDto model)
{
    var response = new Response<object>();

    try
    {
        using (AseConnection con = new AseConnection(aseConnection))
        {
            AseCommand cmd = new AseCommand("sp_employees", con);
            cmd.CommandType = CommandType.StoredProcedure;

            var aggregatorId = CodeUsername.Username; 

            cmd.Parameters.AddWithValue("@psAggregatorId", aggregatorId);
            cmd.Parameters.AddWithValue("@psAcctNo", model.AcctNumber);
            cmd.Parameters.AddWithValue("@psAppend2Name", model.AppendName);

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }

        response.Data = $"{model.AcctNumber} appended successfully with {model.AppendName}";
        response.Success = true;
    }
    catch (Exception ex)
    {
        _logger.Error($"An error occurred " + ex.ToString());
        response.Success = false;
    }

    return response;
}

如前所述,我已经编写了成功时处理的代码。如果成功,它将显示在响应中

response.Data = $"{model.AcctNumber} appended successfully with {model.AppendName}";
response.Success = true;

但是,当它失败或重命名 = 'Y' 时,如何调整代码,然后让它显示 .NET Core 中存储过程中@rsErrorText 的内容作为响应的一部分?

请注意,@rsErrorText 是必需的。

谢谢

【问题讨论】:

  • 根据您的结构,您可能需要向AppendRequestDto 添加一个字段以接受@rsErrorText。另外,你是否有一定的条件来判断成功与否?如果能得到这个条件,是否可以直接在AppendAccount中判断?

标签: c# asp.net-core asp.net-web-api stored-procedures ado.net


【解决方案1】:

当您需要向用户报告错误并处理返回给命令对象的错误时,最好在存储过程中使用 THROW 或 RAISEERROR 语句。您可以从 SQLException 中读取错误文本,并进行相应的处理。

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 2021-05-03
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2022-11-18
    • 2019-02-19
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多