我花了大约7个小时试图通过反复试验找出答案。我看到的所有在线示例都不起作用,或者不适用,或者仅显示Im所寻找内容的一半。
这是我要的内容:1.一个使用一个IN参数和一个OUT参数的MYSQL中简单存储过程的示例。2.使用C#从Visual Studio调用FUNCTIONING(确实很重要,导致在线示例有时无法工作…)的示例。文本调用或存储过程命令类型都可以。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参数。现在,这是经过多次迭代之后的,这里我将函数的原样保留下来,并将其归结为两个问题: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结果(选择)。
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 } }