使用 MySQL 和 C# ASPNET 创建和调用存储过程

发布于 2025-01-14 18:34:14 字数 2380 浏览 2 评论 0原文

我想使用 OdbcCommand 类在 MySql 中创建存储过程。

命名存储过程后,我为存储过程中的每个参数定义一个 OdbcCommand 参数。

IN 参数 使用参数名称和包含该值的对象进行定义,OUT 参数 使用参数名称和预期返回的数据类型进行定义。

所有参数都需要定义参数方向。

以下 C# 代码是我的测试。

SP 创建正确,但我有错误

错误 [42000] [MySQL][ODBC 5.1 驱动程序][mysqld-5.1.51-community] 你 SQL 语法有错误;查看对应的手册 到您的 MySQL 服务器版本以获取在附近使用的正确语法 第 1 行的“add_emp”

关于 C# 代码的这一部分

try
{
    conn.Open();
    cmd.Connection = conn;

    cmd.CommandText = "add_emp;";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.AddWithValue("@tname", "Jones");
    cmd.Parameters["@tname"].Direction = ParameterDirection.Input;

    cmd.Parameters.Add("@empno", OdbcType.Int);
    cmd.Parameters["@empno"].Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery();  <<< Line of error

    Response.Write("Employee exists: " + cmd.Parameters["@empno"].Value);
}
catch (Exception ex)
{
    throw ex;
}

有什么建议吗?

using (OdbcConnection conn =
   new OdbcConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
{
    OdbcCommand cmd = new OdbcCommand();

    try
    {
        conn.Open();
        cmd.Connection = conn;

        cmd.CommandText = "DROP PROCEDURE IF EXISTS add_emp";
        cmd.ExecuteNonQuery();

        cmd.CommandText = "CREATE PROCEDURE add_emp(" +
                          "IN tname VARCHAR(255), OUT empno INT)" +
                          "BEGIN SELECT EXISTS( SELECT empo FROM do_table WHERE name = tname ) INTO @titem_id; " +
                          "SET empno = @titem_id; END";
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    conn.Close();

    try
    {
        conn.Open();
        cmd.Connection = conn;

        cmd.CommandText = "add_emp;";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.AddWithValue("@tname", "Jones");
        cmd.Parameters["@tname"].Direction = ParameterDirection.Input;

        cmd.Parameters.Add("@empno", OdbcType.Int);
        cmd.Parameters["@empno"].Direction = ParameterDirection.Output;

        cmd.ExecuteNonQuery();

        Response.Write("Employee exists: " + cmd.Parameters["@empno"].Value);
    }
    catch (Exception ex)
    {
        throw ex;
    }

    conn.Close();
}

I want creating stored procedures in MySql using the OdbcCommand class.

After the stored procedure is named, I define one OdbcCommand parameter for every parameter in the stored procedure.

IN parameters are defined with the parameter name and the object containing the value, OUT parameters are defined with the parameter name and the data type that is expected to be returned.

All parameters need the parameter direction defined.

The following C# code it's my test.

The SP it's created correctly but I have error on

ERROR [42000] [MySQL][ODBC 5.1 Driver][mysqld-5.1.51-community] You
have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near
'add_emp' at line 1

On this part of C# code

try
{
    conn.Open();
    cmd.Connection = conn;

    cmd.CommandText = "add_emp;";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.AddWithValue("@tname", "Jones");
    cmd.Parameters["@tname"].Direction = ParameterDirection.Input;

    cmd.Parameters.Add("@empno", OdbcType.Int);
    cmd.Parameters["@empno"].Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery();  <<< Line of error

    Response.Write("Employee exists: " + cmd.Parameters["@empno"].Value);
}
catch (Exception ex)
{
    throw ex;
}

Any suggestion?

using (OdbcConnection conn =
   new OdbcConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
{
    OdbcCommand cmd = new OdbcCommand();

    try
    {
        conn.Open();
        cmd.Connection = conn;

        cmd.CommandText = "DROP PROCEDURE IF EXISTS add_emp";
        cmd.ExecuteNonQuery();

        cmd.CommandText = "CREATE PROCEDURE add_emp(" +
                          "IN tname VARCHAR(255), OUT empno INT)" +
                          "BEGIN SELECT EXISTS( SELECT empo FROM do_table WHERE name = tname ) INTO @titem_id; " +
                          "SET empno = @titem_id; END";
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    conn.Close();

    try
    {
        conn.Open();
        cmd.Connection = conn;

        cmd.CommandText = "add_emp;";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.AddWithValue("@tname", "Jones");
        cmd.Parameters["@tname"].Direction = ParameterDirection.Input;

        cmd.Parameters.Add("@empno", OdbcType.Int);
        cmd.Parameters["@empno"].Direction = ParameterDirection.Output;

        cmd.ExecuteNonQuery();

        Response.Write("Employee exists: " + cmd.Parameters["@empno"].Value);
    }
    catch (Exception ex)
    {
        throw ex;
    }

    conn.Close();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文