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

时间:2015-10-29 04:17:04

标签: c# mysql sql

由于MySQL不允许参数的默认值,我一直在尝试从代码中发送Null值,但遗憾的是没有任何工作。

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

我的问题是,无论如何我不能从C#发送MySql可以解释为空值的值。原因我问这个原因我正在使用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());
}

1 个答案:

答案 0 :(得分:1)

感谢有价值的评论,解决方案是您应该指定参数的类型并将其设为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;

正如您在此处所看到的,即使您没有传递空值也没有问题,因为参数已经添加,如果没有值,那么它将为空。