将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); } }