簡體   English   中英

db查詢:一個字段可以是null,另一個不是“無法將'System.DBNull'類型的object轉換為'System.String'類型”

[英]db query: one field ok to be null, another not “Unable to cast object of type 'System.DBNull' to type 'System.String'”

我在數據庫表中有兩列,架構是這樣的:

columnA text DEFAULT NULL,

列 B varchar(250) 默認columnB

在 DbContext 中,它們的聲明如下:

public byte[] columnA { get; set; }
public string columnB { get; set; }

如果我在我的表columnA = null中設置一些記錄,一切都很好,沒有問題。 如果我在表columnB = null中設置某些記錄(沒有其他差異),EntityFrameworkCore 層會引發異常:

Microsoft.EntityFrameworkCore.Query[10100] 迭代上下文類型的查詢結果時發生異常。 System.InvalidCastException:無法將“System.DBNull”類型的 object 轉換為“System.String”類型。 在 MySqlConnector.Core.Row.GetString(Int32 ordinal) 在 /_/src/MySqlConnector/Core/Row.cs:line 377

columnB不是該記錄的 null 時,一切正常; 保持一切不變,並且僅將一條記錄的columnB更改為null ,會導致異常。 崩潰的代碼只是對數據庫的查詢,它將返回(以及其他)帶有 null 字段的項目。

var itemQuery = _myDbContext.Item.Where(a => a.id == id);
if (!await itemQuery.AnyAsync()) {...}
var listOfItems = itemQuery.ToList(); // this is where it crashes.

這是我嘗試過的:

  • 將 columnB 聲明為public string? columnB {get;set;} public string? columnB {get;set;} 沒區別。
  • 我將架構中的 columnB 重新定義為text ,而不是varchar(250) 我更新了數據庫,確認如果 columnB 不是 null,一切正常。 然后我再次(手動)制作了 null 以獲取一條記錄,但它仍然崩潰。
  • 我找到了一種解決方法,我只是捕獲了異常,然后繼續,但這並不是真正的解決方案。

我想了解為什么會發生這種情況,為什么它是columnB的問題,但它不是columnA的問題,以及如何/如果我可以修復它以便columnB也可以是null

非常感謝您閱讀並提出任何建議或想法。 編輯:根據要求,堆棧跟蹤:

Microsoft.EntityFrameworkCore.Query[10100]
      An exception occurred while iterating over the results of a query for context type 'MyApp.Database.MyAppDbContext'.
      System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
         at MySqlConnector.Core.Row.GetString(Int32 ordinal) in /_/src/MySqlConnector/Core/Row.cs:line 377
         at MySql.Data.MySqlClient.MySqlDataReader.GetString(Int32 ordinal) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs:line 272
         at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
   at MySqlConnector.Core.Row.GetString(Int32 ordinal) in /_/src/MySqlConnector/Core/Row.cs:line 377
   at MySql.Data.MySqlClient.MySqlDataReader.GetString(Int32 ordinal) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs:line 272
   at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()

當我遇到類似錯誤時,有效的解決方案是顯式檢查來自數據庫的數據的 System.DBNull 值。 從您的問題中不清楚您是如何從數據庫中獲取數據的,但在我的情況下,我填寫了 DataTable 對象,然后檢查傳入的值,如下所示:

using System.Data;
(...)
DataTable dt;
(...)
foreach (DataRow dr in dt.Rows) //iterate through all rows of the datatable
{
    if (dr["columnB"] != System.DBNull.Value)
    {
        //cast value of dr["columnB"] appropriately and store it in a local variable
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM