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

pal*_*law 4 c# mysql stored-procedures visual-studio-2015

我花了大约 7 个小时试图通过反复试验来解决这个问题。我看到的所有在线示例要么不起作用,要么不适用,或者只显示了我正在寻找的一半。

这是我要的: 1. MYSQL 中使用一个 IN 参数和一个 OUT 参数的简单存储过程的示例。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
Run Code Online (Sandbox Code Playgroud)

在 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Dre*_*rew 5

我相信代码和图片说的比我以往任何时候都多。

C# DB 层(DB 层conn作为连接字符串):

// 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);
}
Run Code Online (Sandbox Code Playgroud)

C# GUI 测试层:

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);
}
Run Code Online (Sandbox Code Playgroud)

存储过程(取一个数,乘以 7):

DROP PROCEDURE IF EXISTS multBy7;
DELIMITER $
CREATE PROCEDURE multBy7
(   IN myNum INT,
    OUT theProduct INT
)
BEGIN
    SET theProduct=myNum*7;
END$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

调试视图(阅读:它有效。11x7=77):

在此处输入图片说明

MySQL Connector 6.9.9.0/Visual Studio 2015 : 在此处输入图片说明

另请参阅5.10.1 使用来自连接器/网络的存储例程,年龄未知。