小编典典

要求调用存储过程C#的合法示例:MYSQL

mysql

我花了大约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();
        }
    }

阅读 302

收藏
2020-05-17

共1个答案

小编典典

您应该设置对参数的引用

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
            }
        }
2020-05-17