如何在 web api 上调用带有参数 asp.net 的存储过程?
Posted
技术标签:
【中文标题】如何在 web api 上调用带有参数 asp.net 的存储过程?【英文标题】:How to call stored procedure with parameters asp.net on web api? 【发布时间】:2021-10-29 04:06:25 【问题描述】:我的 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();
它不返回任何错误,它只是返回空白。我认为这是因为我没有在 return OK() 中包含任何内容,但我不知道将哪个属性放在这些括号中。谢谢。
编辑:
我尝试了所有的答案,然后我发现了别的东西。 将其留在这里,以供将来可能需要的人使用。
[HttpGet]
public IHttpActionResult MyId(string id)
schoolEntity = myenitity = new schoolEntity();
var result = myenitity.find_student(id).ToList();
return Ok(result);
感谢大家的时间、努力和耐心。我真的很感激。
【问题讨论】:
数据访问库是 ADO.NET,不是 EF 也不是 ASP.NET Web API。 EF 是一个 ORM,它使用 ADO.NET 来执行查询。至于您发布的代码,它的工作原理与编写的完全相同。return Ok();
返回一个空响应。该代码甚至使用了ExecuteNonQuery
,这意味着查询不会返回任何结果。你想做什么?既然您使用了EF
标签,为什么不实际使用实体框架呢?还是像 Dapperr 这样的微型 ORM?
我尝试此代码的控制器位于 Web api 中。我想返回此方法在执行时将从数据库中获取的数据。完成后,应该以 xml 格式显示数据(据我所知,web api 中的数据只能以 xml/json 格式读取)。
并且cmd.ExecuteNonQuery();
不会在存储过程中返回查询的结果,并且您不会将返回的结果分配给任何变量。这段代码看起来太试探了。无论如何,使用普通的 ADO.Net 并不是最好的选择。使用 Dapper 从存储过程中获取数据几乎是微不足道的。我会探索这条路。
好吧,我可能在这里有很多错误和错误以及误解,因为我是这一切的新手。但是你能告诉我使用或不使用实体框架从 Web api 中的存储过程中获取实际数据的正确方法吗?
consultwithgriff.com/dapper-stored-procedures
【参考方案1】:
要获取数据,您需要一个数据读取器和数据结构来加载。创建一个学生类
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();
【讨论】:
你需要一个using
块
@Charlieface 谢谢。这只是一个提示。【参考方案2】:
问题的代码不会检索查询结果或向调用者返回任何内容。事实上,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)
...
【讨论】:
感谢您提供所有这些信息。如何将我从 url 提供的参数放到这个新的 id = 1 中,我不想要静态参数。 只传参数或变量 我现在有一个错误,上面写着 sqlcon.Query --- SqlConnection 不包含“查询”的定义。 你添加了 Dapper 吗?你检查了我提供的链接吗? 是的,我添加了尿布。开始使用它。但现在它没有得到我的参数。它仍然说“存储过程(find_student)需要一个未提供的参数(id)”。new id = someid
的第一个 id 是什么意思?【参考方案3】:
在这里,我使用 ADO.Net Entity 框架通过我的数据库(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 中的存储过程并获取结果的方式类似。
【讨论】:
以上是关于如何在 web api 上调用带有参数 asp.net 的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用标题中的两个参数和正文中的第二个参数从另一个 MVC 项目调用 Web API
如何在 REMIX(Solidity IDE)中从 web3 调用带有参数的构造函数
如何在 Asp.Net WebForm 中调用 Web API?