下面的代码给出了一个错误——“没有从DBnull到int的隐式转换”。

SqlParameter[] parameters = new SqlParameter[1];    
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;

当前回答

sqlCom.Parameters.Add(new SqlParameter("@qavCode", SqlDbType.Char, 11)).Value = (object)(string.IsNullOrEmpty(rf.Request.QavCode) ? null : rf.Request.QavCode) ?? DBNull.Value;

改进空合并操作符的使用??在我的例子中,为了管理空字符串,我将常规三元?:混合到空并合运算符??希望我的建议是有用的。

其他回答

公认的答案是使用类型转换。但是,大多数SQL类型都有一个特殊的Null字段,可以用来避免这种类型转换。

例如,SqlInt32。表示一个DBNull,可以分配给这个SqlInt32类的实例。

int? example = null;
object exampleCast = (object) example ?? DBNull.Value;
object exampleNoCast = example ?? SqlInt32.Null;
int? nullableValue = null;
object nullableValueDB
{
   get{
       if(nullableValue==null)
          return DBNull.Value;
       else
          return (int)nullableValue;
   }
}

我这样解。

考虑使用可用的Nullable(T)结构。它将允许您仅在拥有值时设置值,SQL Command对象将识别可为空的值并进行相应的处理,而不会给您带来麻烦。

sqlCom.Parameters.Add(new SqlParameter("@qavCode", SqlDbType.Char, 11)).Value = (object)(string.IsNullOrEmpty(rf.Request.QavCode) ? null : rf.Request.QavCode) ?? DBNull.Value;

改进空合并操作符的使用??在我的例子中,为了管理空字符串,我将常规三元?:混合到空并合运算符??希望我的建议是有用的。

你可以这样做。这里startDate和endDate是可空的datetime参数

var Statistics= db.Database.SqlQuery<ViewStatistics>("YourStoreProcedure_Or_sqlQuery  @startDate,@endDate",
        new SqlParameter("startDate", startDate?? (object)DBNull.Value),
        new SqlParameter("endDate", endDate?? (object)DBNull.Value)
        ).ToList();