C#-MySQL将Null参数传递给存储过程
本文关键字:存储过程 参数传递 Null C#-MySQL | 更新日期: 2023-09-27 18:19:39
由于MySQL不允许参数使用默认值,我一直试图从代码中发送Null值,但不幸的是什么都不起作用。
我在这里读过很多问题,我知道有一个解决方法,发送空字符串,然后在存储过程中执行if语句。
我的问题是,我是否可以从C#发送一个值,MySql可以将其解释为null值。我之所以这么问,是因为我使用的是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());
}
感谢您的宝贵意见,解决方案是您应该指定参数的类型并将其设为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。