在C#和ASP.NET中使用ODBC和MySql存储过程

q3aa0525  于 2023-04-04  发布在  Mysql
关注(0)|答案(1)|浏览(131)

我注册的主机暂时不支持使用C# ASP NET的MySql.Data.MySqlClient,他们不能说什么时候可以。
FAQ建议使用MySQL ODBC 5.2 UNICODE Driver连接我的mysql数据库,执行存储过程。
我过去从未使用过这种类型的ODBC连接,实际上我得到的是空返回。
sProc的输出值为空。
MySQL数据库上的存储过程,使用phpmyAdmin,工作正常。
sProc的输出值为3。
我在网上找到了很多不同的建议,但都没有解决我的问题。
如何解决这个问题?
我的代码如下。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            try
            {
                using (OdbcConnection connection =
                    new OdbcConnection(ConfigurationManager.ConnectionStrings["con"].ConnectionString))
                {
                    using (OdbcCommand cmd =
                        new OdbcCommand("{Call s_sproc(?,?)}", connection))
                    {
                        cmd.Connection.Open();
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@pin_dd", DateTime.Now.ToString("dd"));
                        cmd.Parameters.AddWithValue("@out_userid", OdbcType.Char).Direction = ParameterDirection.Output;
                        cmd.ExecuteNonQuery();
                        cmd.Connection.Close();

                        if (cmd.Parameters["@out_userid"].Value != DBNull.Value)
                        {
                            int number = Convert.ToInt32(cmd.Parameters["@out_userid"].Value);

                            if (number > 0)
                            {
                                Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert",
                                    "alert('" + number.ToString() + "');", true);
                            }
                            else
                            {
                                Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert",
                                    "alert('null');", true);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("operation failed!", ex);
            }
            finally
            {

            }
        }
    }
}

DELIMITER $$
CREATE DEFINER=`Sql_user`@`%` PROCEDURE `s_sproc`(
IN `pin_dd` VARCHAR(255), 
OUT `out_userid` VARCHAR(255))
BEGIN
SET @out_userid := NULL;
SET @s = CONCAT('SELECT DAY(t_Date) from t_table WHERE DAY(t_Date) = ',pin_dd,' INTO @out_userid;');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE `stmt`;
SET out_userid := @out_userid;
SELECT @out_userid;
END$$
DELIMITER ;
@out_userid
3

更新#01 -- Solution @AnandSowmithiran

try
        {
            using (OdbcConnection connection =
                new OdbcConnection(ConfigurationManager.ConnectionStrings["con"].ConnectionString))
            {
                using (OdbcCommand cmd =
                    new OdbcCommand("{Call s_sproc(?,?)}", connection))
                {
                    cmd.Connection.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Clear();

                    cmd.Parameters.Add("@pin_dd", OdbcType.VarChar, 100);
                    cmd.Parameters["@pin_dd"].Value = DateTime.Now.ToString("dd");

                    cmd.Parameters.Add("@out_userid", OdbcType.VarChar, 100);
                    cmd.Parameters["@out_userid"].Direction = ParameterDirection.Output;

                    string getValue = cmd.ExecuteScalar().ToString();

                    if (!String.IsNullOrEmpty(getValue))
                    {
                            Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert",
                                "alert('" + getValue.ToString() + "');", true);
                    }
                    else
                    {
                            Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert",
                                "alert('null');", true);
                    }

                    cmd.Connection.Close();
                }
            }
        }
        catch (Exception ex)
        {
            throw new ApplicationException("operation failed!", ex);
        }
        finally
        {

        }
czq61nw1

czq61nw11#

这里是要做的更改,以使其工作,
1.通过调用Parameters集合Add方法而不是AddWithValue()将Parameters添加到存储过程。
1.提及string类型化参数中的size
1.您应该使用ExecuteScalar而不是ExecuteNonQuery

相关问题