由于MySQL不允许参数的默认值,我一直在尝试从代码中发送Null值,但遗憾的是没有任何工作。
我在这里阅读了很多问题,我知道有一种解决方法是通过发送空字符串然后在存储过程中执行if语句。
我的问题是,无论如何我不能从C#发送MySql可以解释为空值的值。原因我问这个原因我正在使用IS NULL
检查已经在所有sp中实现了,因为我已经从MSSQL迁移到了MySQL。
我已经尝试了常规null
和DBNull.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());
}
答案 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;
正如您在此处所看到的,即使您没有传递空值也没有问题,因为参数已经添加,如果没有值,那么它将为空。