2017-05-05 164 views
0

我有這個API,它調用存儲過程中插入一個值,它在存儲過程中幾個PRINT語句從SQL Server存儲過程返回自定義消息的Web API C#

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的返回值。我怎樣才能做到這一點?

當前行回報outputMessage給出了一個錯誤「使用未賦值的變量,並不能隱式轉換字符串IHttpActionResult」

任何幫助是極大的讚賞。

+1

這些是兩個非常無關的問題。第一個是[使用未分配的本地變量是什麼意思?](http://stackoverflow.com/q/5710485/11683)的副本,第二個是[Web API 2中的返回字符串]的副本, (http://stackoverflow.com/q/35344226/11683) – GSerg

+0

您只分配回調中的消息,因此,它沒有被分配,編譯器正確地確定它只會在事件處理程序被命中後才被分配。此外,字符串不是IHttpActionResult,但是您可以返回(在收到正確消息後)'Ok(outputMessage)' – Icepickle

+1

此外,混合控制器與數據訪問一樣沒有完成,如果您再次需要相同的功能,它會導致代碼重複和代碼維護'地獄' – Icepickle

回答

0

要只回答標題中的問題,可以將輸出參數添加到存儲過程,這就是我通常使用的。

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

其他問題都簡單地返回正確的類型的方法聲明的問題。返回一個ContentResult或其他一些實現已聲明接口的對象。

+0

感謝Alex,所以你的意思是使用輸出參數而不是PRINT語句形式的自定義消息,並將C#的輸出參數分配給retutn ok(output_parameter)? – KMR

+1

是的,您可以通過在命令中添加定義爲輸出的參數並在命令執行後讀取它們的值來讀取ADO.Net中的輸出參數。你做事的方式可能會奏效,我從來沒有這樣做過。 –

+0

我現在正在那邊工作。所以沒有其他辦法可以讓我將SqlinfoMesssage返回給API()? – KMR

0

您可以使用ExecuteNonQuery返回int值,方法看起來像通過存儲過程插入數據。或者,您也可以使用存儲過程中的參數來獲取任何特定的成功消息。

[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); 
    } 
} 
+0

感謝您的回覆。但我想從我的存儲過程中返回自定義消息:( – KMR

+0

你的存儲過程是怎樣的?它有輸出參數還是消息從表中返回? –

+0

我有IF v_user> 0 PRINT'User Exist'ELSE PRINT 'New User' – KMR

相關問題