繁体   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