C#:如何将包含空值的 guid 类型的数据库字段转换为局部变量?

标签 c# ms-access guid

我的一侧有一个 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

因此,为了避免我的异常,我想我最好在将唯一标识符值从数据库中的字段传输到局部变量之前进行测试。这就是说,我仍然对我的发现感到困扰,我想更深入地研究这个问题。

我的问题如下:

  1. 有没有一种方法可以编写一些基本代码,将数据库 Guid 值中的值分配给本地 Guid 对象,而无需在 System.DBNull 上进行测试?
  2. 为什么应用于同一对象的同一指令会返回不同的类型,这取决于原始字段是否包含值?

编辑问题 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/

相关文章:

c# - String.Format 为阿拉伯文本抛出 'Input string was not in a correct format'

c# - 为单元测试 stub ASP.NET Page.Form

java - 从 JAVA Access 存储在 MS-Access 数据库中的日期/时间数据

sql-server - Access 从 SQL Server 截断我的 Decimal 值的链接表

notepad++ - 使用全部替换在 GUID 中放置破折号

random - 与随机字符串相比,UUID 或 GUID 的用途是什么?

c# - 在 C# 中使用快照时,FFMpegCore 不生成输出

c# - 创建显示多维数据集 View 的软件的想法?

ms-access - ADO 执行 - 编译错误 : User-defined type not defined

mysql - Mysql UUID_SHORT() 是否与 UUID() 相当