[英]System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type '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.
這是我嘗試過的:
public string? columnB {get;set;}
public string? columnB {get;set;}
。 沒區別。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.