c#SqlDataReader数据库存储的guid或null

时间:2018-11-14 15:39:59

标签: c# guid sqldatareader

我在数据库记录1和记录2中有两个记录。数据读取器将为记录1返回guid值,并且代码可以正常工作。但是在记录2上,数据读取器将返回“”。我的问题是如何在没有异常的情况下添加字符串为空,这两个选项都出错。 立即获胜

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

代码

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

2 个答案:

答案 0 :(得分:2)

我看到了:

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

还有这个:

  

在记录2上,数据读取器将返回“”

这两个东西不兼容。我怀疑您确实有一个Guid列,记录2正在返回NULL,这反过来在阅读器中显示为DBNull.Value,并为{{1 }}结果将生成您在此处观察到的空字符串。

如果是这样,您可以执行以下操作:

.ToString()

现在问题是DBNull.Value块。问题是这样的:

  

如何在没有例外的情况下添加字符串为空

答案是:不能。 C#是一种强类型的语言,我们已经看到while (dataReader.Read()) { if (dataReader["Id"] != DBNull.Value) { d.id = (Guid)dataReader["Id"]; } else { //get an empty string } } 属性是else您不能将弦状的销钉插入Guid形的孔中。您必须将此字段保留为空,或定义一些默认的Guid值以表示该值仍然为空,然后更改代码在其他地方显示一个空字符串而不是Guid,那么该值将与选择的默认值匹配。

答案 1 :(得分:1)

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

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"]);
}

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