簡體   English   中英

如何在 web api 上調用帶有參數 asp.net 的存儲過程?

[英]How to call stored procedure with parameters asp.net on web api?

我的 sql 數據庫上有一個存儲過程,它需要一個參數,並使用該參數從視圖中返回數據。

我的存儲過程:

create procedure find_student @id varchar(6)
as
begin
select name,lastname,birthday,email,phone,city,country,university,study_year from v_scholarship 
where id = @id
end

我的 api 控制器:

    [HttpGet]
    public IHttpActionResult MyId(string id)
    {

        string config = ConfigurationManager.ConnectionStrings["mycon"].ConnectionString;
        using (SqlConnection sqlcon = new SqlConnection(config))
        {
            SqlCommand cmd = new SqlCommand("find_student", sqlcon);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@id", id);
            sqlcon.Open();
            cmd.ExecuteNonQuery();
            sqlcon.Close();
            return Ok();
        }

    }

它不返回任何錯誤,它只返回blank 我認為這是因為我沒有在 return OK() 中包含任何內容,但我不知道將哪個屬性放入這些括號中。謝謝。

編輯:

我嘗試了所有的答案,然后我找到了別的東西。 把這個留在這里只是為了將來可能需要它的人。

[HttpGet]
public IHttpActionResult MyId(string id)
{
    schoolEntity = myenitity = new schoolEntity();
    var result = myenitity.find_student(id).ToList();
    return Ok(result);
}

感謝大家的時間、努力和耐心。 對此,我真的非常感激。

問題的代碼不會檢索查詢的結果或向調用者返回任何內容。 事實上, ExecuteNonQuery明確表示 SQL 命令不會返回任何結果。

即使這更改為使用ExecuteReader生成結果,結果也必須映射到實際對象。

如果使用Dapper之類的庫在后台構造命令,執行它並映射結果,則可以簡化代碼:

using (SqlConnection sqlcon = new SqlConnection(config))
{
    var student = sqlcon.Query("find_student", new {id = someId},
        commandType: CommandType.StoredProcedure)
                        .SingleOrDefault();
    return Ok(student);
}

就是這樣。 Dapper 負責根據需要打開和關閉連接。 在幕后,它創建了一個sp_executesql調用,該調用調用按名稱傳遞參數的存儲過程。 在這種特殊情況下,結果作為實現IDictionary<string,object>對象返回,因此它們可以序列化為 XML 或 JSON。

實際上,將響應序列化為 XML 或 JSON 是 ASP.NET Web API 的工作,而不是操作的工作。 Web API 會將響應序列化為調用者的Accept-Content-Type標頭請求的任何格式。

Dapper與強類型結果類一起使用更為常見,例如Student

class Student
{
    public string name {get;set;} 
    public string lastname {get;set;}
    ...
}

...
var students = sqlcon.Query<Student>("find_student_by_course", 
    new { course= "abc"},
    commandType: CommandType.StoredProcedure);
foreach(var student in students)
{
...
}

要獲取數據,您需要加載數據讀取器和數據結構。 創建學生類

class Student
{
    public string name {get;set;} 
    public string lastname {get;set;}
    ...
}

並替換

 cmd.ExecuteNonQuery();

var studenList= new List<Student>();

SqlDataReader reader = cmd.ExecuteReader();  
 while (reader.Read())  
  {  
                var student=new Student();
             student.name=reader["name"].ToString();
             student.lastname=reader["lastname"].ToString();
                ... and so on
            
             studentList.Add(student);
             
    }  
  
            //Release resources  
            reader.Close();  
            conn.Close();  
       

在這里,我使用 ADO.Net 實體框架通過我的數據庫(Microsoft SQL 服務器)進行連接,並創建了存儲過程“MemberShoppingCart”,它根據成員 ID 過濾記錄並返回特定成員訂購的產品。 在這里,我已將 memberId 作為參數傳遞給我的存儲過程。

   public IHttpActionResult GetInvoiceDetailsById(int id)
    {
        try
        {
            Tbl_Members member = new Tbl_Members();
            List<InvoiceDetails> cd = _unitofwork.GetRepositoryInstance<InvoiceDetails>().GetResultBySqlprocedure("MemberShoppingCart @memberId", new SqlParameter("memberId", System.Data.SqlDbType.Int) { Value = id }).ToList();
            return Ok(cd);
        }

        catch 
        {
            return StatusCode(HttpStatusCode.NoContent);
        }

    }

這是將參數傳遞給 ASP .NET Web API 中的存儲過程並獲取結果的類似方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM