![](/img/trans.png)
[英]Call MySql stored procedure which take 2 parameters from asp.net core 2.2 web API controller
[英]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.