InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]

Posted

技术标签:

【中文标题】InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]【英文标题】:InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.Nullable`1[System.Int32]' [duplicate] 【发布时间】:2019-06-10 05:59:00 【问题描述】:

我正在尝试从数据库执行存储过程。但是,我遇到了一个例外:

InvalidCastException:无法将“System.DBNull”类型的对象转换为 输入“System.Nullable`1[System.Int32]”。

“results.Add”行抛出异常。

var result = new List<GetActiveUserPackagesForOpenBillingPeriodResult> ();

using (var conn = new NpgsqlConnection ("Host=localhost;Port=xxx;Database=xxx;Username=postgres;Password=xxx;TrustServerCertificate=true;ApplicationName=xxx;")) 
    using (var cmd = new NpgsqlCommand ("\"GetActiveUserPackagesForOpenBillingPeriod\"", conn)) 
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue ("somedate", DateTime.Today);
        conn.Open ();

        var reader = cmd.ExecuteReader ();

        string x = DBNull.Value.Equals (reader) ? " " : reader.ToString ();

        if (x != null) 
        
            while (reader.Read ()) 

                result.Add (
                    new GetActiveUserPackagesForOpenBillingPeriodResult 
                        Amount = (decimal) reader["Amount"],
                            AcceptanceActID = (int?) reader["AcceptanceActID"],
                            PackageID = (int) reader["PackageID"],
                            UserID = (int) reader["UserID"],
                            AccountID = (int) reader["AccountID"],
                            HasChangedPackage = (bool) reader["HasChangedPackage"],
                    
                );
            
        
    

【问题讨论】:

【参考方案1】:

来自DBNull 文档:

DBNull 表示不存在的值,其中null 表示不存在 对对象的引用。

为了解决您的问题,

在更改值的类型之前进行空检查,然后将其分配给变量

result.Add (
     new GetActiveUserPackagesForOpenBillingPeriodResult 
     Amount = (decimal) reader["Amount"],
     AcceptanceActID =  Convert.IsDBNull(reader["AcceptanceActID"]) ? null : (int?) reader["AcceptanceActID"],
     PackageID = (int) reader["PackageID"],
     UserID = (int) reader["UserID"],
     AccountID = (int) reader["AccountID"],
     HasChangedPackage = (bool) reader["HasChangedPackage"],
        );

【讨论】:

【参考方案2】:

使用Convert.IsDBNull()检查值是DBNull然后使用值

result.Add (
    new GetActiveUserPackagesForOpenBillingPeriodResult 
        Amount = (decimal) reader["Amount"],
            AcceptanceActID = !Convert.IsDBNull(reader["AcceptanceActID"]) ? (int?) reader["AcceptanceActID"] :  null,
            PackageID = (int) reader["PackageID"],
            UserID = (int) reader["UserID"],
            AccountID = (int) reader["AccountID"],
            HasChangedPackage = (bool) reader["HasChangedPackage"],
    
);

【讨论】:

以上是关于InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]

System.InvalidCastException: 无法将类型为“LabelManager2.ApplicationClass”的 COM对象强制转换为

InvalidCastException:无法使用Unity(C#)从源类型转换为目标类型

防止在工作目录中加载 dll,InvalidCastException Type A 无法转换为 Type B

将程序集加载到单独的 AppDomain 中,得到 InvalidCastException

如何将“IStorageItem”的实现传递给 DataPackage.SetStorageItems(items) 并且不会在 UWP 上引发 InvalidCastException?