【问题标题】:InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.Nullable`1[System.Int32]' [duplicate]InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]
【发布时间】: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"],
                    }
                );
            }
        }
    }
}

【问题讨论】:

    标签: c# sql postgresql asp.net-core


    【解决方案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"],
          }
      );
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2017-05-05
        • 2019-12-24
        • 1970-01-01
        • 2014-01-30
        • 2012-05-24
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多