【问题标题】:c# SqlDataReader Database stored guid or nullc# SqlDataReader 数据库存储 guid 或 null
【发布时间】:2018-11-14 15:39:59
【问题描述】:

我在数据库记录 1 和记录 2 中有两条记录。数据读取器将返回记录 1 的 guid 值,并且代码工作正常。但在记录 2 上,datareader 将返回“”。我的问题是如何添加 String Empty 没有例外,这两个选项都错误。 立竿见影

?dataReader["Id"].GetType().FullName
"System.Guid"

代码

while (dataReader.Read())
{
d.id = new Guid(dataReader["Id"].ToString());
//Guid.TryParse(dataReader["Id"]?.ToString(), out d.Id)
}

【问题讨论】:

  • Guid.TryParse 有什么问题?
  • 在调用 .ToString() 之前检查数据读取器中的对象是否为空:if (dataReader["Id"] != DBNull.Value) { d.id = new Guid(dataReader["Id"].ToString()); }.

标签: c# guid sqldatareader


【解决方案1】:

我看到了:

?dataReader["Id"].GetType().FullName
"System.Guid"

还有这个:

在记录 2 上,datareader 将返回 ""

这两件事是不相容的。我怀疑您确实有一个 Guid 列,并且记录 2 正在返回 NULL,这又在阅读器中显示为 DBNull.Value,并为 DBNull.Value 结果调用 .ToString() 然后产生您观察到的空字符串在这里。

如果是这样,你可以这样做:

while (dataReader.Read())
{
    if (dataReader["Id"] != DBNull.Value)
    {
        d.id = (Guid)dataReader["Id"];
    }
    else
    {
        //get an empty string
    }
}

现在的问题是 else 块。问题是这样说的:

我怎样才能毫无例外地添加空字符串

答案是:你不能。 C# 是一种强类型语言,我们已经看到d.id 属性是System.Guid你不能在 Guid 形状的孔中安装一个字符串形的钉子。 你必须将此字段留空,或者定义一些默认的 Guid 值以表示该值仍然为空,然后更改代码在其他地方显示一个空字符串而不是 Guid,然后该值与选择的默认值匹配。

【讨论】:

    【解决方案2】:

    预测所有可能的情况总是一个好主意:

    Guid guid;
    
    if(dataReader.HasRows)
    {
        while(dataReader.Read()) 
        {
            if(dataReader["Id"].Equals(DBNull.Value)==false)
            {
                var sid = dataReader["Id"].ToString();
                if(sid.Length > 0 && Guid.TryParse(sid, out guid))
                {
                    d.id = guid;
                }
            }
        }
    }
    

    如果您必须经常这样做,请为该任务编写一个帮助库函数。

    根据数据库列的底层类型,您可以简化。 对于 MS SQL Server 中uniqueidentifier 的可能示例,它将简化为:

    if(dataReader["Id"].Equals(DBNull.Value) == false)
    {
        d.id = Convert.ToGuid(dataReader["Id"]);
    }
    

    因为在这种情况下,如果存在非空值,则不会出现类型不匹配。

    【讨论】:

    • 使用 Equals 运算符有什么好处吗?肯定 "dataReader["Id"] != DBNull.Value" 更简单,更容易理解?
    • 老实说我不知道​​。大概。 dr["column"] is DBNullis also popular.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2010-10-19
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多