请求调用存储过程C#:MYSQL的合法示例
我花了大约7个小时试图通过反复试验来弄清楚这一点。 我见过的所有在线例子都不起作用,或者不适用,或者只显示我寻找的一半。
下面是我所要求的:1.一个在MYSQL中使用一个IN参数和一个OUT参数的简单存储过程的例子。 2.一个函数的例子(真的很重要,导致在线例子有时没有工作…)从Visual Studio调用,使用C#。 文本调用或存储过程命令types工作。 3. AddWithValue已被弃用。 4.我希望看到out参数实际上工作。
如果MYSQL和visual studio不可能这样做,那也不错。
对于这个特定的例子,MYSQL文档不够彻底。 而且,请不要使用Visual Studio或C#仇恨。
提前致谢! 🙂
编辑:
这是我迄今为止设法做到的,它不工作!
MYSQL方面,使用HeidiSQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(IN `stuff` VARCHAR(50), IN `pass` VARCHAR(50), OUT `param3` INT) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN set param3 = 0; set param3 = (select count(*) from users where username=stuff and userpassword=pass); select @param3; END
而在C#方面,我试图得到这个OUT参数。 现在,这是经过多次迭代后,我已经烧了什么function曾经是,并煮沸了两个问题:1. OUT参数将无法正常工作,和2.即使Visual Studio传递IN参数,SQL拒绝承认他们。
protected void Login_Authenticate(object sender, AuthenticateEventArgs e) { using (MySqlConnection con = new MySqlConnection(strcon)) { con.Open(); MySqlCommand com = new MySqlCommand("CALL login(@stuff, @pass, @param3);", con); com.CommandType = CommandType.Text; com.Parameters.Add("@stuff", MySqlDbType.VarChar); com.Parameters["@stuff"].Value = Login.UserName; com.Parameters.Add("@pass", MySqlDbType.VarChar); com.Parameters["@pass"].Value = Login.Password; try { obj = com.ExecuteScalar(); objparam = com.Parameters["param3"].Value; if (Convert.ToInt32(obj) != 0) { Response.Redirect("Welcome.aspx"); } else { Login.PasswordRequiredErrorMessage = "invalid user name and password"; } } catch (Exception ex) { Console.WriteLine(ex.Message); } con.Close(); } }
您应该设置参数的参考
var param3 = new MySqlParameter(); param3.Direction = ParameterDirection.Output; param3.DbType = // whatever the dbtype for int is or whatever you need. param3.ParameterName = "param3"; com.Parameters.Add(param3);
在你的try块中插入
var result = com.ExecuteReader(); // or com.ExecuteScalar();
执行完毕后,你的参数应该填充值,你也应该可以读取SP结果(select)。
var paramResult = param3.Value;
读取SP的结果可以作为读者或标量来完成。
// execute reader while (result.Read()) { int value = result.GetInt32(0)); } /* read returned values in result */ // execute scalar int value; if (int.TryParse($"{result}", out value)) { /* do something with value */ }
/ ********* /
这块应该让你去你需要的地方
const string strcon = "whatevs"; using (MySqlConnection con = new MySqlConnection(strcon)) { const string sql = "login"; MySqlCommand com = new MySqlCommand(sql, con); com.CommandType = CommandType.StoredProcedure; var stuffParam = new MySqlParameter("stuff", stuffValue); var passParam = new MySqlParameter("pass", passValue); var param3Param = new MySqlParameter(); param3Param.ParameterName = "param3"; param3Param.DbType = DbType.Int32; param3Param.Direction = ParameterDirection.Output; com.Parameters.Add(stuffParam); com.Parameters.Add(passParam); com.Parameters.Add(param3Param); try { var scalarResult = com.ExecuteScalar(); // because you used select @param3 in your sp. int value; if (int.TryParse($"{scalarResult}", out value)) { //do something with value } //// because you used select @param3 in your sp. //var readerResult = com.ExecuteReader(); //if (readerResult.Read()) //{ // // // value = readerResult.GetInt32(0); //} int param3Returned; if(int.TryParse($"{param3Param.Value}", out param3Returned)) { // do something with param3Returned } } catch (Exception ex) { // do something with ex } }
我相信代码和图片比以往任何时候都要多。
C#数据库层(DB层具有conn
作为连接string):
// Note: this is an instance (myDB in terms of the GUI Object) using System.Data; using MySql.Data.MySqlClient; ... ... public long MultBySeven(long theNum) { // Call a Mysql Stored Proc named "multBy7" // which takes an IN parameter, Out parameter (the names are important. Match them) // Multiply the IN by 7 and return the product thru the OUT parameter long lParam = 0; using (MySqlConnection lconn = new MySqlConnection(connString)) { lconn.Open(); using (MySqlCommand cmd = new MySqlCommand()) { cmd.Connection = lconn; cmd.CommandText = "multBy7"; // The name of the Stored Proc cmd.CommandType = CommandType.StoredProcedure; // It is a Stored Proc // Two parameters below. An IN and an OUT (myNum and theProduct, respectively) cmd.Parameters.AddWithValue("@myNum", theNum); // lazy, not specifying ParameterDirection.Input; cmd.Parameters.AddWithValue("@theProduct", MySqlDbType.Int32); cmd.Parameters["@theProduct"].Direction = ParameterDirection.Output; // from System.Data cmd.ExecuteNonQuery(); // let it rip Object obj = cmd.Parameters["@theProduct"].Value; lParam = (Int32)obj; // more useful datatype } } return (lParam); }
C#GUItesting层:
private void btnTestInOut_Click(object sender, EventArgs e) { // This GUI Layer call thru the use of a business object or data layer object (`myDB`) long localHere = myDB.MultBySeven(11); }
存储过程(取一个数字,乘以7):
DROP PROCEDURE IF EXISTS multBy7; DELIMITER $ CREATE PROCEDURE multBy7 ( IN myNum INT, OUT theProduct INT ) BEGIN SET theProduct=myNum*7; END$ DELIMITER ;
debugging视图(阅读:它工作。11×7 = 77):
MySQL Connector 6.9.9.0
/ Visual Studio 2015
:
另请参见5.10.1使用Connector / Net中存储的例程 ,时间未知。