asp.net调用mysql存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net调用mysql存储过程相关的知识,希望对你有一定的参考价值。

mycomm = new mysqlCommand("sp_luckdraw", myco);

mycomm.CommandType = CommandType.StoredProcedure;

MySqlParameter myParameter = new MySqlParameter("@prizeCode",MySqlDbType.VarChar, 50);
myParameter.Value = strValue.ToUpper();
myParameter.Direction = ParameterDirection.Input;
mycomm.Parameters.Add(myParameter);

MySqlParameter myParameter2 = new MySqlParameter("@result", MySqlDbType.Int32);
myParameter2.Direction = ParameterDirection.Output;
mycomm.Parameters.Add(myParameter2);

using (dr = mycomm.ExecuteReader(CommandBehavior.CloseConnection))

string strResult1 = myParameter2.Value.ToString();
while (dr.Read())

string strResult = dr["result"].ToString();



请我为什么传出参数myParameter2.Value是null,怎么解决。(存储过程在mysql数据库执行没问题)

类的调用方法:
public int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)

using (SqlConnection connection = new SqlConnection(strConn))

int result;
connection.Open();
SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
rowsAffected = command.ExecuteNonQuery();
result = (int)command.Parameters["ReturnValue"].Value;
//Connection.Close();
return result;


Mysql的简单存储过程:

CREATE PROCEDURE `DELETEDB`(IN m_orgid char(12))
BEGIN
delete from hardwareinfo where orgid=m_orgid;
delete from addressinfo where orgid=m_orgid;
END
参考技术A

你执行的方式也许有问题,试试下面的

//把using那段全部替换为
mycomm.ExecuteNonQuery();
string strResult1 = myParameter2.Value.ToString();

 如果上述代码不行,再在mysql里直接执行存储过程看返回值到底是什么。

本回答被提问者和网友采纳

如何在 web api 上调用带有参数 asp.net 的存储过程?

【中文标题】如何在 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 中的存储过程并获取结果的方式类似。

【讨论】:

以上是关于asp.net调用mysql存储过程的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.net 中运行时调用存储过程

从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型

PHP 开发人员应该使用 MySQL 的存储过程吗? [关闭]

来自 Oracle 存储过程的 ASP.NET 数据集

ODBC调用存储过程

(asp.net)求一Sqlserver存储过程和网页代码,根据不同参数执行不同的查询语句。