即使我读过有关null和数据库的问题,我也有点困惑。我试图找出如何向数据库表单C#发送NULL。方法单一是
MyMethod(string category, int? calories, int vegetarianFriendlyMeal);
当使用非null int调用时,它可以,但是当我传递 null 时,它会说。
SqlCommand.Prepare方法要求所有参数都具有显式设置类型。
请您告诉我如何允许将null传递给数据库并在下面的代码中明确设置类型?谢谢。
command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category;
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal;
if (calories == null)
{
command.Parameters.AddWithValue("@calories", DBNull.Value);
}
else
{
command.Parameters.Add("@calories", SqlDbType.Int).Value = calories;
}
我也试过
SqlParameter cal = new SqlParameter("@calories", calories == null ? (object)DBNull.Value : calories);
command.Parameters.Add(cal);
具有相同的结果。
答案 0 :(得分:1)
你试过了吗?
cmd.Parameters.Add("@calories", System.Data.SqlDbType.Int).Value = DBNull.Value;
答案 1 :(得分:1)
解决方案很简单。在案例1中,使用AddWithValue
的.NET无法推断DBNull.Value
的关联类型。案例1的解决方案是:
command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category;
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal;
if (calories == null)
{
command.Parameters.Add("@calories", SqlDbType.Int).Value = (object)DBNull.Value;
}
else
{
command.Parameters.Add("@calories", SqlDbType.Int).Value = calories;
}
在案例2中,您根本不提供类型。解决方案是:
command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category;
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal;
SqlParameter cal = new SqlParameter("@calories", calories == null ? (object)DBNull.Value : calories);
cal.DbType = SqlDbType.Int;
command.Parameters.Add(cal);
但如果你想让它干净,你可以这样做:
command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category;
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal;
command.Parameters.Add("@calories", SqlDbType.Int).Value = calories ?? (object)DBNull.Value;
编辑:不要使用AddWithValue
。让.NET给你填补漏洞是有风险的。