将空值插入 SQL 数据库

Insert Null value into TSQL database

即使我已经阅读了有关 null 和数据库的问题,我还是有点困惑。我想弄清楚如何将 NULL 发送到 C# 中的数据库。方法签名是

MyMethod(string category, int? calories, int vegetarianFriendlyMeal);

当用 not null int 调用时没问题,但是当我传递 null 时它说。

SqlCommand.Prepare method requires all parameters to have an explicitly set type.

你能告诉我如何允许将 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);

同样的结果。

你试过了吗:

cmd.Parameters.Add("@calories", System.Data.SqlDbType.Int).Value = DBNull.Value;

这里的解决方法很简单。在情况 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 为您填补漏洞是有风险的。