【问题标题】:System.InvalidCastException: 'Object cannot be cast from DBNull to other types.' in Conversion from Database to ObjectSystem.InvalidCastException: \'Object cannot be cast from DBNull to other types.\' in Conversion from Database to Object
【发布时间】:2022-10-04 18:58:33
【问题描述】:

当我尝试从我的数据库设置 DateTime 时遇到问题。我有一个 DBnull tjek。我已经让我的 Datetime 可以为空。不知道为什么。

  public static List<ExportElements> GetExportElementsForCase(int caseNumber)
    {
        using (var dataAccess = new DbConnection<SqlConnection>())
        {
            DataTable dbExportElements = new DataTable();
            dataAccess.ExecuteCommand<DataTable>(command =>
            {
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "GetElementsForEksport";

                var caseNr = command.CreateParameter();
                caseNr.ParameterName = "@caseNumberTolookUp";
                caseNr.Value = caseNumber;
                command.Parameters.Add(caseNr);

                var reader = command.ExecuteReader();
                //Create a new DataTable.
                DataTable resultToReturn = new DataTable("exportElements");

                //Load DataReader into the DataTable.
                resultToReturn.Load(reader);
                dbExportElements = resultToReturn;
                return resultToReturn;
            });

            List<ExportElements> exportMarterials = new List<ExportElements>();
            exportMarterials = (from DataRow dr in dbExportElements.Rows
                                select new ExportElements()
                                {
                                    CaseNumber = Convert.ToInt32(dr["CaseNumber"]),
                                    SubCaseNumber = Convert.ToInt32(dr["SubCaseNumber"]),
                                    ElementNumber = dr["ElementNumber"].ToString(),
                                    Side3To4 = Convert.ToDouble(dr["Side3To4"]),
                                    Side2To5 = Convert.ToDouble(dr["Side2To5"]),
                                    Side1To6 = Convert.ToDouble(dr["Side1To6"]),
                                    Weight = Convert.ToDouble(dr["Weight"]),
                                    Volume = Convert.ToDouble(dr["Volume"]),
                                    ProductNumber = Convert.ToInt32(dr["ProductNumber"]),
                                    DepartmentNumber = Convert.ToInt32(dr["DepartmentNumber"]),
                                    TurnElement = Convert.ToBoolean(dr["TurnElement"]),
                                    ErektionSeqence = Convert.ToInt32(dr["ErektionSeqence"]),
                                    ID = Convert.ToInt32(dr["ID"]),
                                    ReleasedDate = dr["ReleasedDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["ReleasedDate"]),
                                    ElementBasicPart = dr["ElementBasicPart"].ToString(),
                                    RevisionsLetter = dr["RevisionsLetter"].ToString(),
                                    ElementStatus = Convert.ToInt32(dr["ElementStatus"]),
                                    RevisionsText = dr["RevisionsText"].ToString(),
                                    EnvironmentalClass = Convert.ToInt32(dr["EnvironmentalClass"]),
                                    LedgeHeight1 = Convert.ToDouble(dr["LedgeHeight1"]),
                                    LedgeHeight2 = Convert.ToDouble(dr["LedgeHeight2"]),
                                    IsClosed = Convert.ToBoolean(dr["IsClosed"]),
                                    RevitTemplate = dr["revitTemplate"].ToString(),
                                }).ToList();

            return exportMarterials;
        }
    }

是 releaseDate 失败了。

我要从 DataRow 转换为的模型。

public class ExportElements
{
    public int CaseNumber { get; set; }
    public int SubCaseNumber { get; set; }
    public string ElementNumber { get; set; }
    public double Side3To4 { get; set; }
    public double Side2To5 { get; set; }
    public double Side1To6 { get; set; }
    public double Weight { get; set; }
    public double Volume { get; set; }
    public int ProductNumber { get; set; }
    public int DepartmentNumber { get; set; }
    public bool TurnElement { get; set; }
    public int ErektionSeqence { get; set; }
    public int ID { get; set; }
    public DateTime? ReleasedDate { get; set; }
    public string ElementBasicPart { get; set; }
    public string RevisionsLetter { get; set; }
    public int ElementStatus { get; set; }
    public string RevisionsText { get; set; }
    public int EnvironmentalClass { get; set; }
    public double LedgeHeight1 { get; set; }
    public double LedgeHeight2 { get; set; }
    public bool IsClosed { get; set; }
    public string RevitTemplate { get; set; }
}

它适用于具有相同 Datarow 到 DateTime 转换的其他转换

我发现了问题。不是日期时间吗?但是我忘记检查的也是 DBNull 女巫的“ErektionSeqence”。

【问题讨论】:

  • 欢迎来到 stackoverflow 肯尼斯!尝试将dr["ReleasedDate"] == DBNull.Value 更改为dr["ReleasedDate"].HasValue - 请参阅HasValue。另外,Nullable&lt;DateTime&gt;不必直接转换成DateTime,可以直接使用它的Value属性。
  • @BagusTesa,这是不对的。 ADO.NET 使用DBNull 来表示数据库空值,而不是Nothing
  • @jmcilhinney 哦,这是ado.net?我以为是entity-framework。我的错。没有标签,所以是的,我的错。
  • 只需使用 Dapper ....

标签: c#


【解决方案1】:

当您实际上没有转换任何内容时,不要使用所有这些 Convert 调用,我建议您使用从 LINQ 到 DataSet 的 Field 方法。它可以处理空值。例如。

NonNullableReferenceTypeProperty = row.Field<string>("Column1"),
NullableReferenceTypeProperty = row.Field<string>("Column2"),
NonNullableValueTypeProperty = row.Field<DateTime>("Column3"),
NullableValueTypeProperty = row.Field<DateTime?>("Column4"),

【讨论】:

  • 我正在尝试这个,因为它在重新访问时更容易阅读。但我有一个 int 接收 dbnull 的问题。女巫是洞问题而不是日期时间? ErektionSeqence = dr.Field<int?>("ErektionSeqence"),获得系统无效强制转换。已将对象更改为 int?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2022-12-19
  • 2022-12-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多