如何在 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&lt;string,object&gt; 的对象返回,因此可以将它们序列化为 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?

如何将带有附加数据的 FormData 文件发送到 asp.net web api ajax 调用

如何调用带有认证服务的webapi

带有枚举输入参数的Web Api post方法