c# SqlDataReader 数据库存储guid或null
c# SqlDataReader Database stored guid or null
我在数据库记录 1 和记录 2 中有两条记录。datareader 将为记录 1 return guid 值,代码工作正常。但在记录 2 上,数据读取器将 return“”。我的问题是如何无一例外地添加 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 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"]);
}
因为在这种情况下,如果存在非空值,则不会存在类型不匹配。
我看到了这个:
?dataReader["Id"].GetType().FullName
"System.Guid"
还有这个:
on record 2 the datareader will return ""
这两件事是不相容的。我怀疑您确实有一个 Guid
列并且记录 2 正在返回 NULL
,它又在 reader 中显示为 DBNull.Value
,并调用 .ToString()
DBNull.Value
结果然后会生成您在此处观察到的空字符串。
如果这是真的,您可以这样做:
while (dataReader.Read())
{
if (dataReader["Id"] != DBNull.Value)
{
d.id = (Guid)dataReader["Id"];
}
else
{
//get an empty string
}
}
现在的问题是else
块。问题是这样说的:
How can I add String Empty without the exception
答案是:你不能。 C# 是一种强类型语言,我们已经看到 d.id
属性 是 System.Guid
。 您不能将弦形钉子放入 Guid 形孔中。您必须将此字段留空,或定义一些默认 Guid 值以表示该值仍然为空,并且然后更改其他地方的代码以显示空字符串而不是 Guid 然后该值匹配选择的默认值。
我在数据库记录 1 和记录 2 中有两条记录。datareader 将为记录 1 return guid 值,代码工作正常。但在记录 2 上,数据读取器将 return“”。我的问题是如何无一例外地添加 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 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"]);
}
因为在这种情况下,如果存在非空值,则不会存在类型不匹配。
我看到了这个:
?dataReader["Id"].GetType().FullName
"System.Guid"
还有这个:
on record 2 the datareader will return ""
这两件事是不相容的。我怀疑您确实有一个 Guid
列并且记录 2 正在返回 NULL
,它又在 reader 中显示为 DBNull.Value
,并调用 .ToString()
DBNull.Value
结果然后会生成您在此处观察到的空字符串。
如果这是真的,您可以这样做:
while (dataReader.Read())
{
if (dataReader["Id"] != DBNull.Value)
{
d.id = (Guid)dataReader["Id"];
}
else
{
//get an empty string
}
}
现在的问题是else
块。问题是这样说的:
How can I add String Empty without the exception
答案是:你不能。 C# 是一种强类型语言,我们已经看到 d.id
属性 是 System.Guid
。 您不能将弦形钉子放入 Guid 形孔中。您必须将此字段留空,或定义一些默认 Guid 值以表示该值仍然为空,并且然后更改其他地方的代码以显示空字符串而不是 Guid 然后该值匹配选择的默认值。