C#-MySQL将Null参数传递给存储过程

本文关键字:存储过程 参数传递 Null C#-MySQL | 更新日期: 2023-09-27 18:19:39

由于MySQL不允许参数使用默认值,我一直试图从代码中发送Null值,但不幸的是什么都不起作用。

我在这里读过很多问题,我知道有一个解决方法,发送空字符串,然后在存储过程中执行if语句。

我的问题是,我是否可以从C#发送一个值,MySql可以将其解释为null值。我之所以这么问,是因为我使用的是IS NULL检查,它已经在所有sp中实现,因为我已经从MSSQL迁移到MySQL。

我已经尝试了常规的nullDBNull.Value,但我一直得到一个Unhandled type encountered异常。

CREATE DEFINER=`root`@`localhost` PROCEDURE `User_Check_Avialability`(  
   IN Username NVARCHAR(50),
   IN Email NVARCHAR(50)
    )
BEGIN   
    SELECT  COUNT(*) AS NumberOfUsers
    FROM    User
    WHERE   (( User.Username = Username OR Username IS NULL ) AND ( User.Email = Email OR Email IS NULL ));
END

这是我的代码:

    try
{
    using (MySqlConnection mySqlConnection = new MySqlConnection(Settings.Default.ConnectionString))
    {
        using (MySqlCommand mySqlCommand = new MySqlCommand())
        {
            mySqlCommand.Connection = mySqlConnection;
            mySqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
            mySqlCommand.CommandText = "User_Check_Avialability";
            if (!string.IsNullOrEmpty(objUsers.Username))
                mySqlCommand.Parameters.AddWithValue("Username", objUsers.Username);
            else
                mySqlCommand.Parameters.AddWithValue("Username", DBNull.Value); //Also tried null                      
            if (!string.IsNullOrEmpty(objUsers.Email))
                mySqlCommand.Parameters.AddWithValue("Email", objUsers.Email);
            else
                mySqlCommand.Parameters.AddWithValue("Email", DBNull.Value); //Also tried null
//Also tried
mySqlCommand.Parameters["Username"].IsNullable = true;
mySqlCommand.Parameters["Email"].IsNullable = true;
            bool isAvailable = false;
            mySqlConnection.Open();
            using (MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader())
            {
                if (!mySqlDataReader.HasRows)
                    isAvailable = true;
                else
                {
                    while (mySqlDataReader.Read())
                    {
                        if (int.Parse(mySqlDataReader["NumberOfUsers"].ToString()) == 0)
                            isAvailable = true;
                    }
                }
            }
            return isAvailable;
        }
    }
}
catch (Exception ex)
{
    throw new Exception(ex.ToString());
}

C#-MySQL将Null参数传递给存储过程

感谢您的宝贵意见,解决方案是您应该指定参数的类型并将其设为Nullable

这是示例代码:

                    mySqlCommand.Parameters.Add("Username", MySqlDbType.VarChar);
                    mySqlCommand.Parameters["Username"].Direction = System.Data.ParameterDirection.Input;
                    mySqlCommand.Parameters["Username"].IsNullable = true;
                    if (!string.IsNullOrEmpty(objUsers.Name))
                        mySqlCommand.Parameters["Username"].Value = objUsers.Name;

正如您在这里看到的,即使您没有传递null值,也不会有问题,因为参数已经添加,如果没有值,那么它将为null。