我的一侧有一个 Access 数据库,其中 Tbl_Application.id_connexion
是一个具有 Guid
类型(在 ms Access 术语中称为“复制 ID”)的字段。
我正在通过 DataRow[]
数组 dr_Tbl_Application
从 Tbl_Application 表中收集一些数据。以下代码读取第一个数据行:
private Guid? mid_connexion = null;
mid_connexion = (Guid)dr_Tbl_Application[0]["id_connexion"]
只要 Tbl_Application.id_connexion
保持值,一切都可以。如果此字段没有值,我将收到以下错误:
InvalidCastException was unhandled
这些是我可以在即时窗口中看到的一些内容:
? dr_Programme[0]["id_Connexion"]
{}
? dr_Programme[0]["id_Connexion"].GetType()
{Name = "DBNull" FullName = "System.DBNull"}
? dr_Programme[0]["id_Connexion"] is System.DBNull
true
因此,为了避免我的异常,我想我最好在将唯一标识符值从数据库中的字段传输到局部变量之前进行测试。这就是说,我仍然对我的发现感到困扰,我想更深入地研究这个问题。
我的问题如下:
- 有没有一种方法可以编写一些基本代码,将数据库 Guid 值中的值分配给本地 Guid 对象,而无需在
System.DBNull
上进行测试? - 为什么应用于同一对象的同一指令会返回不同的类型,这取决于原始字段是否包含值?
编辑问题 2:
? dr_Programme[0]["id_Connexion"].GetType()
在原始表中填充相应字段时返回System.Guid类型,而
? dr_Programme[0]["id_Connexion"].GetType()
当字段在原始表中为空(或未填充)时返回 System.DBNull 类型 ...
最佳答案
DBNull
实现了 Null Object Design Pattern地址the difference between DB returning a NULL vs. not returning anything .不幸的是,多年来缺乏直观性一直困扰着程序员。
您能做的最好的事情就是将它包装在一个通用方法中,如下所示:
public static T? GetNullable<T>(object obj) where T : struct
{
if (obj == DBNull.Value) return null;
return (T?)obj;
}
现在你可以像这样调用这个方法:
mid_connexion = GetNullable<Guid>(dr_Tbl_Application[0]["id_connexion"]);
关于C#:如何将包含空值的 guid 类型的数据库字段转换为局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14069809/