Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将null赋值给SqlParameter_C#_Dbnull_Sqlparameter - Fatal编程技术网

C# 将null赋值给SqlParameter

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

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

试试这个:

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