C# 将null赋值给SqlParameter
下面的代码给出了一个错误-“没有从DBnull到int的隐式转换。” 试试这个:C# 将null赋值给SqlParameter,c#,dbnull,sqlparameter,C#,Dbnull,Sqlparameter,下面的代码给出了一个错误-“没有从DBnull到int的隐式转换。” 试试这个: if (AgeItem.AgeIndex != null) { SqlParameter[] parameters = new SqlParameter[1]; SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int); planIndexParameter.Value = AgeItem.AgeI
if (AgeItem.AgeIndex != null)
{
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
}
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;
换句话说,如果参数为null,则不要将其发送到存储过程(当然,假设存储过程接受问题中隐含的null参数)。在我看来,更好的方法是使用类的属性:
除非在存储过程中指定了默认值(如果您使用的是存储过程),否则需要在SQLCommand中将
DBNull.Value
作为null参数传递。最好的方法是在执行查询之前为任何缺少的参数分配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;
因为DBNull和int彼此不同,所以不能在条件语句中使用不同类型的值。希望这会有所帮助。问题是
?:
运算符无法确定返回类型,因为您返回的是int
值或DBNull类型值,它们不兼容
当然,您可以将AgeIndex的实例强制转换为类型object
,以满足?:
要求
您可以使用??空合并运算符,如下所示
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (object)AgeItem.AgeIndex ?? DBNull.Value;
parameters[0] = planIndexParameter;
下面是对?:
运算符的引用,用于解释问题
第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换
试试这个:
if (AgeItem.AgeIndex != null)
{
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
}
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;
试着这样做:
if(\u id\u categoria\u padre>0)
{
Add(“id\u categoria\u padre”,SqlDbType.Int).Value=\u id\u categoria\u padre;
}
其他的
{
Add(“id\u categoria\u padre”,DBNull.Value).Value=DBNull.Value;
}
建议使用石膏。但是,大多数SQL类型都有一个特殊的Null字段,可以用来避免这种强制转换
例如,“表示可以分配给SqlInt32类的此实例的DBNull。”
我就是这样解决的。考虑使用可用的可空(T)结构。它只允许您在有值的情况下设置值,并且您的SQL命令对象将识别可为空的值,并相应地进行处理,而不会给您带来任何麻烦。这就是我所做的
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();
var PhoneParam=new-SqlParameter(“@Phone”,DBNull.Value);
if(user.user\u Info\u Phone!=null)
{
PhoneParam.SqlValue=user.user\u Info\u Phone;
}
返回此.Database.SqlQuery(“UpdateUserInfo@UserName、@NameLast、@namemidle、@NameFirst、@Address、@City、@State、@PostalCode、@Phone”,
UserNameParam、NameLastParam、namemidleparam、namelfirstparam、AddressParam、CityParam、StateParam、PostalParam、PhoneParam).Single();
如果使用条件(三元)运算符,编译器需要在两种类型之间进行隐式转换,否则会出现异常
因此,您可以通过将两者中的一个强制转换为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;
}
一种简单的扩展方法是:
public static void AddParameter(this SqlCommand sqlCommand, string parameterName,
SqlDbType sqlDbType, object item)
{
sqlCommand.Parameters.Add(parameterName, sqlDbType).Value = item ?? DBNull.Value;
}
我使用一个带有空检查的简单方法
public SqlParameter GetNullableParameter(string parameterName, object value)
{
if (value != null)
{
return new SqlParameter(parameterName, value);
}
else
{
return new SqlParameter(parameterName, DBNull.Value);
}
}
使用一行代码,尝试以下操作:
var piParameter = new SqlParameter("@AgeIndex", AgeItem.AgeIndex ?? (object)DBNull.Value);
我的代码,在真实项目中工作
在生成sqlparameter之前查看三元运算符
这是我最好的方法,没有任何问题:
public bool Key_AddExisting
(
string clave
, int? idHito_FileServer
, int? idTipoDocumental_Almacen
, string tipoExp_CHJ
, int idTipoExp_Verti2
, int idMov_Verti2
)
{
List<SqlParameter> pars = new List<SqlParameter>()
{
new SqlParameter { ParameterName = "@Clave", Value = clave }
LOOK -> , idHito_FileServer == null ? new SqlParameter { ParameterName = "@IdHito_FileServer", Value = DBNull.Value } : new SqlParameter { ParameterName = "@IdHito_FileServer", Value = idHito_FileServer }
LOOK -> , idTipoDocumental_Almacen == null ? new SqlParameter { ParameterName = "@IdTipoDocumental_Almacen", Value = DBNull.Value } : new SqlParameter { ParameterName = "@IdTipoDocumental_Almacen", Value = idTipoDocumental_Almacen }
, new SqlParameter { ParameterName = "@TipoExp_CHJ", Value = tipoExp_CHJ }
, new SqlParameter { ParameterName = "@IdTipoExp_Verti2", Value = idTipoExp_Verti2 }
, new SqlParameter { ParameterName = "@IdMov_Verti2", Value = idMov_Verti2 }
};
string sql = "INSERT INTO [dbo].[Enlaces_ClavesCHJ_MovimientosVerti2] " +
"( " +
" [Clave] " +
", [IdHito_FileServer] " +
", [IdTipoDocumental_Almacen] " +
", [TipoExp_CHJ] " +
", [IdTipoExp_Verti2] " +
", [IdMov_Verti2] " +
") " +
"VALUES" +
"( " +
" @Clave" +
", @IdHito_FileServer" +
", @IdTipoDocumental_Almacen" +
", @TipoExp_CHJ" +
", @IdTipoExp_Verti2" +
", @IdMov_Verti2" +
")";
return DbBasic.ExecNonQuery(ref this.conn, sql, pars);
}
public bool Key\u AddExisting
(
弦乐
,int?idHito_文件服务器
,int?idTipoDocumental_Almacen
,字符串tipoExp\u CHJ
,int idTipoExp_Verti2
,int idMov_Verti2
)
{
列表PAR=新列表()
{
新的SqlParameter{ParameterName=“@Clave”,Value=Clave}
LOOK->,idHito_FileServer==null?新的SqlParameter{ParameterName=“@idHito_FileServer”,Value=DBNull.Value}:新的SqlParameter{ParameterName=“@idHito_FileServer”,Value=idHito_FileServer}
LOOK->,idTipoDocumental\u Almacen==null?新的SqlParameter{ParameterName=“@idTipoDocumental\u Almacen”,Value=DBNull.Value}:新的SqlParameter{ParameterName=“@idTipoDocumental\u Almacen”,Value=idTipoDocumental\u Almacen}
,新的SqlParameter{ParameterName=“@TipoExp_CHJ”,Value=TipoExp_CHJ}
,新的SqlParameter{ParameterName=“@IdTipoExp\u Verti2”,Value=IdTipoExp\u Verti2}
,新的SqlParameter{ParameterName=“@IdMov_Verti2”,Value=IdMov_Verti2}
};
string sql=“插入[dbo]。[Enlaces\u ClavesCHJ\u MoviminentosVerti2]”+
"( " +
“[Clave]”+
“,[IdHito_文件服务器]”+
“,[IdTipoDocumental_Almacen]”+
“,[TipoExp_CHJ]”+
“,[IdTipoExp\u Verti2]”+
“,[IdMov_Verti2]”+
") " +
“价值观”+
"( " +
“@Clave”+
“,@IdHito_文件服务器”+
“,@IdTipoDocumental_Almacen”+
“,@TipoExp_CHJ”+
“,@IdTipoExp\u Verti2”+
“,@IdMov_Verti2”+
")";
返回DbBasic.execonquery(参考this.conn、sql、pars);
}
您需要将AgeItem.AgeIndex强制转换为对象,我认为。。。(顺便说一句,为什么第三行末尾的==
)但是现在,您只是省略了一个参数-我非常怀疑存储过程会对此感到高兴。。。。最有可能的是,调用将失败,声明“提供的参数@AgeIndex没有值,这是预期的”……哇。严厉的如果未传递参数(@AgeIndex int=0),只需将存储过程写入默认值即可。这种事经常发生。客户端可以接受默认值,也可以通过传递参数来覆盖默认值。为什么要进行向下投票?但是如果值是DBNull.value
,ADO.NET可能很难猜测SqlDbTyp是什么
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();
public static void AddParameter(this SqlCommand sqlCommand, string parameterName,
SqlDbType sqlDbType, object item)
{
sqlCommand.Parameters.Add(parameterName, sqlDbType).Value = item ?? DBNull.Value;
}
public SqlParameter GetNullableParameter(string parameterName, object value)
{
if (value != null)
{
return new SqlParameter(parameterName, value);
}
else
{
return new SqlParameter(parameterName, DBNull.Value);
}
}
var piParameter = new SqlParameter("@AgeIndex", AgeItem.AgeIndex ?? (object)DBNull.Value);
public bool Key_AddExisting
(
string clave
, int? idHito_FileServer
, int? idTipoDocumental_Almacen
, string tipoExp_CHJ
, int idTipoExp_Verti2
, int idMov_Verti2
)
{
List<SqlParameter> pars = new List<SqlParameter>()
{
new SqlParameter { ParameterName = "@Clave", Value = clave }
LOOK -> , idHito_FileServer == null ? new SqlParameter { ParameterName = "@IdHito_FileServer", Value = DBNull.Value } : new SqlParameter { ParameterName = "@IdHito_FileServer", Value = idHito_FileServer }
LOOK -> , idTipoDocumental_Almacen == null ? new SqlParameter { ParameterName = "@IdTipoDocumental_Almacen", Value = DBNull.Value } : new SqlParameter { ParameterName = "@IdTipoDocumental_Almacen", Value = idTipoDocumental_Almacen }
, new SqlParameter { ParameterName = "@TipoExp_CHJ", Value = tipoExp_CHJ }
, new SqlParameter { ParameterName = "@IdTipoExp_Verti2", Value = idTipoExp_Verti2 }
, new SqlParameter { ParameterName = "@IdMov_Verti2", Value = idMov_Verti2 }
};
string sql = "INSERT INTO [dbo].[Enlaces_ClavesCHJ_MovimientosVerti2] " +
"( " +
" [Clave] " +
", [IdHito_FileServer] " +
", [IdTipoDocumental_Almacen] " +
", [TipoExp_CHJ] " +
", [IdTipoExp_Verti2] " +
", [IdMov_Verti2] " +
") " +
"VALUES" +
"( " +
" @Clave" +
", @IdHito_FileServer" +
", @IdTipoDocumental_Almacen" +
", @TipoExp_CHJ" +
", @IdTipoExp_Verti2" +
", @IdMov_Verti2" +
")";
return DbBasic.ExecNonQuery(ref this.conn, sql, pars);
}