将null分配给SqlParameter

下面的代码给出了一个错误 – “没有从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; 

问题是: ?:操作符无法确定返回types,因为您要返回不兼容的int值或DBNulltypes值。

您当然可以将AgeIndex的实例转换为满足?:要求的typesobject

你可以使用?? 空合并运算符如下

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

以下是解释问题的?:操作符的MSDN文档的引用

first_expression和second_expression的types必须相同,或者从一个types到另一个types必须存在隐式转换。

接受的答案build议使用演员。 但是,大多数SQLtypes都有一个特殊的Null字段,可以用来避免这种情况。

例如, SqlInt32.Null “表示可以分配给SqlInt32类的此实例的一个DBNull”。

 int? example = null; object exampleCast = (object) example ?? DBNull.Value; object exampleNoCast = example ?? SqlInt32.Null; 

除非在存储过程中指定了默认值(如果使用的是存储过程),否则您需要在SQLCommand中将DBNull.Value作为空parameter passing。 最好的方法是在查询执行前为任何缺less的参数分配DBNull.Value,遵循foreach将完成这项工作。

 foreach (SqlParameter parameter in sqlCmd.Parameters) { if (parameter.Value == null) { parameter.Value = DBNull.Value; } } 

否则改变这一行:

 planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex; 

如下:

 if (AgeItem.AgeIndex== null) planIndexParameter.Value = DBNull.Value; else planIndexParameter.Value = AgeItem.AgeIndex; 

因为不能在条件语句中使用不同types的值,因为DBNull和int彼此不同。 希望这会有所帮助。

用一行代码,试试这个:

 var piParameter = new SqlParameter("@AgeIndex", AgeItem.AgeIndex ?? (object)DBNull.Value); 

尝试这个:

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

在我看来更好的方法是用SqlCommand类的Parameters属性来做到这一点:

 public static void AddCommandParameter(SqlCommand myCommand) { myCommand.Parameters.AddWithValue( "@AgeIndex", (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex); } 

考虑使用可用的Nullable(T)结构。 它只会让你设置值,如果你有它们,你的SQL命令对象将会识别可以为空的值并相应地处理,而不会在你的最后遇到麻烦。

如果使用条件(三元)运算符,则编译器需要两种types之间的隐式转换,否则会得到exception。

所以你可以通过将其中的一个转换为System.Object来修复它:

 planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : (object) AgeItem.AgeIndex; 

但是因为结果不是很漂亮,而且你总是要记住这个转换,所以你可以使用这样的扩展方法:

 public static object GetDBNullOrValue<T>(this T val) { bool isDbNull = true; Type t = typeof(T); if (Nullable.GetUnderlyingType(t) != null) isDbNull = EqualityComparer<T>.Default.Equals(default(T), val); else if (t.IsValueType) isDbNull = false; else isDbNull = val == null; return isDbNull ? DBNull.Value : (object) val; } 

那么你可以使用这个简洁的代码:

 planIndexParameter.Value = AgeItem.AgeIndex.GetDBNullOrValue(); 

尝试这个:

 if (AgeItem.AgeIndex != null) { SqlParameter[] parameters = new SqlParameter[1]; SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int); planIndexParameter.Value = AgeItem.AgeIndex; parameters[0] = planIndexParameter; } 

换句话说,如果参数为空,就不要发送给你存储的proc(当然,假设存储的proc接受你的问题隐含的空参数)。

尝试这样的事情:

 if (_id_categoria_padre > 0) { objComando.Parameters.Add("id_categoria_padre", SqlDbType.Int).Value = _id_categoria_padre; } else { objComando.Parameters.Add("id_categoria_padre", DBNull.Value).Value = DBNull.Value; } 
 int? nullableValue = null; object nullableValueDB { get{ if(nullableValue==null) return DBNull.Value; else return (int)nullableValue; } } 

我正在解决这个问题

 if (_id_categoria_padre > 0) { objComando.Parameters.Add("id_categoria_padre", SqlDbType.Int).Value = _id_categoria_padre; } else { objComando.Parameters.Add("id_categoria_padre", DBNull.Value).Value = DBNull.Value; } 
 if (AgeItem.AgeIndex== null) cmd.Parameters.Add(new SqlParameter("ParaMeterName", SqlDbType.DateTime).Value = DBNull); else cmd.Parameters.Add(new SqlParameter("ParaMeterName", SqlDbType.DateTime).Value = AgeItem.AgeIndex); 

这就是我所做的…

  var PhoneParam = new SqlParameter("@Phone", DBNull.Value); if (user.User_Info_Phone != null) { PhoneParam.SqlValue = user.User_Info_Phone; } return this.Database.SqlQuery<CustLogonDM>("UpdateUserInfo @UserName, @NameLast, @NameMiddle, @NameFirst, @Address, @City, @State, @PostalCode, @Phone", UserNameParam, NameLastParam, NameMiddleParam, NameFirstParam, AddressParam, CityParam, StateParam, PostalParam, PhoneParam).Single(); 
  dynamic psd = DBNull.Value; if (schedule.pushScheduleDate > DateTime.MinValue) { psd = schedule.pushScheduleDate; } sql.DBController.RunGeneralStoredProcedureNonQuery("SchedulePush", new string[] { "@PushScheduleDate"}, new object[] { psd }, 10, "PushCenter"); 

一个简单的扩展方法是:

  public static void AddParameter(this SqlCommand sqlCommand, string parameterName, SqlDbType sqlDbType, object item) { sqlCommand.Parameters.Add(parameterName, sqlDbType).Value = item ?? DBNull.Value; } 

任何错误,只需创build“可空”参数呢?

  public SqlParameter GetNullableParameter(string parameterName, object value) { if (value == null) { return new SqlParameter(parameterName, value); } else { return new SqlParameter(parameterName, DBNull.Value); } }