【问题标题】:Return a custom message from SQL Server stored procedure to Web API C#将自定义消息从 SQL Server 存储过程返回到 Web API C#
【发布时间】:2017-05-05 09:23:27
【问题描述】:

我有这个 API,它调用一个存储过程来插入一个值,并且它在存储过程中几乎没有 PRINT 语句

public class ConfirmJobController : ApiController
{
    [HttpPost]
    public IHttpActionResult Post(JobConfirmation confirmation)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        {
            string outputMessage;

            con.Open();
            SqlCommand cmd = new SqlCommand("usp_PhoneApp_ConfirmBooking", con);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@p_jobId", confirmation.JobID);
            cmd.Parameters.AddWithValue("@p_jobStatus", confirmation.JobStatus);
            cmd.Parameters.AddWithValue("@p_createdDate", confirmation.CreatedDate);

            cmd.ExecuteNonQuery();

            con.InfoMessage += delegate (object sender1, SqlInfoMessageEventArgs e1)
            {
                outputMessage = e1.Message;
            };

            return outputMessage;

        }
    }
}

我想从存储过程中获取自定义消息到 API 的返回值。我怎样才能做到这一点?

目前 return outputMessage 行给出了“使用未分配的变量并且无法将字符串隐式转换为 IHttpActionResult”的错误

非常感谢任何帮助。

【问题讨论】:

  • 这是两个非常不相关的问题。第一个是What does “Use of unassigned local variable” mean?的副本,第二个是Return a String in Web API 2的副本
  • 您只是在回调中分配消息,因此,它没有被分配,编译器正确识别它只会在事件处理程序被命中后被分配。此外,字符串不是 IHttpActionResult,但是您可以返回(正确接收消息后)Ok( outputMessage )
  • 另外,像这样将控制器与数据访问混合在一起是不可能的,如果您再次需要相同的功能,这将导致代码重复和代码维护“地狱”
  • @Icepickle:虽然我原则上同意你的观点,但我认为我们不应该对此过于严厉。我可以很容易地看到自己为一个小的一次性或测试项目做同样的事情,并在项目增长并且我需要更多结构时进行重构。但是,是的,我通常也有服务。
  • @AlexPaven 虽然我同意对于小型项目来说,过于复杂的结构没有意义,但在我看来,许多东西已经可以用于其他请求(比如建立连接),我只是指出来 :) 不想成为龙 :)

标签: c# api asp.net-web-api


【解决方案1】:

要只回答标题中的问题,您可以在存储过程中添加一个输出参数,这是我通常使用的。

https://technet.microsoft.com/en-us/library/ms187004.aspx

其他问题只是返回方法声明的正确类型。返回一个 ContentResult 或其他实现声明接口的对象。

【讨论】:

  • 谢谢 Alex,所以您的意思是使用输出参数形式的自定义消息而不是 PRINT 语句,并将输出参数从 C# 分配给 retutn ok(output_parameter)?
  • 是的,您可以通过将定义为输出的参数添加到命令并在命令执行后读取它们的值来读取 ADO.Net 中的输出参数。你做事的方式可能行得通,我只是从来没有那样做。
  • 我现在正在这样做。所以没有其他方法可以让 SqlinfoMesssage 到 API 返回 Ok()?
  • 就像我说的 SqlInfoMessage 方式可以工作。只需在声明时将 outputMessage 初始化为空字符串或 null,这应该会让编译器满意。然后你可以使用 Ok() 返回 outputMessage 并且它应该可以工作,假设 SqlInfoMessage 做了它应该做的事情(就像我说我从未使用过它)。
【解决方案2】:

你可以使用ExecuteNonQuery返回int值,方法看起来像通过存储过程插入数据。或者,您也可以在存储过程中使用 out 参数来获取任何特定的成功消息。

[HttpPost]
public IHttpActionResult Post(JobConfirmation confirmation)
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
    {
        string outputMessage;

        con.Open();
        SqlCommand cmd = new SqlCommand("usp_PhoneApp_ConfirmBooking", con);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.AddWithValue("@p_jobId", confirmation.JobID);
        cmd.Parameters.AddWithValue("@p_jobStatus", confirmation.JobStatus);
        cmd.Parameters.AddWithValue("@p_createdDate", confirmation.CreatedDate);

        if(cmd.ExecuteNonQuery() > 0)
           outputMessage = "Success";
        else
           outputMessage = "Failed";

        return Ok(outputMessage);
    }
}

【讨论】:

  • 感谢您的回复。但我想从我的存储过程中返回自定义消息:(
  • 您的存储过程是什么样的?表中是否有输出参数或消息返回?
  • 我有 IF v_user > 0 PRINT '用户存在' ELSE PRINT '新用户'
  • 在您的问题中添加您的存储过程,替换实际的表名。看起来你需要在存储过程中有输出参数
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2016-11-03
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多