将Null值插入TSQL数据库

时间:2017-03-09 15:47:52

标签: c# database dbnull

即使我读过有关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);

具有相同的结果。

2 个答案:

答案 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给你填补漏洞是有风险的。