不使用字符串将Cast ExecuteScalar结果转换为GUID?

5

如何将ExecuteScalar命令的结果转换为GUID结构,而不必先使用.ToString()传递给GUID的构造函数?

这样做的原因是为了提高性能,避免在内存中创建数千个不必要的字符串对象。

使用读取器和GetGUID方法可以实现,但我没有找到任何关于如何在使用标量值时实现相同效果的参考。

更新:我还需要处理DBNull值。

3个回答

10

假设您的SQL语句不会返回DBNull.Value,那么是的,您可以这样做:

Guid myResult = (Guid) cmd.ExecuteScalar();

编辑:现在我们知道您需要处理空值...

我可以想到两种处理空值的方法 - 使用可为空的Guid并将其设置为null,或者使用普通Guid并将其设置为Guid.Empty(如果您的SQL语句返回null)。

考虑一些帮助函数或扩展方法,用于检查DBNull.Value。

    static Guid? GetGuidFromDb(object dbValue)
    {
        if (dbValue == null || DBNull.Value.Equals(dbValue))
        {
            return null;
        }
        else
        {
            return (Guid) dbValue;
        }
    }
或者
    static Guid GetGuidFromDb(object dbValue)
    {
        if (dbValue == null || DBNull.Value.Equals(dbValue))
        {
            return Guid.Empty;
        }
        else
        {
            return (Guid) dbValue;
        }

然后调用

Guid? myResult = GetGuidFromDb(cmd.ExecuteScalar());

请注意 - 如果您的 SQL 命令返回的数据类型不是 UniqueIdentifier,此代码将会出错。


谢谢 - 我最初忘记了DBNull,这就是为什么我一直在苦苦挣扎,因为它们不能评估为普通的null。 - John

-1
    Guid myResult = cmd.ExecuteScalar() as Guid? ?? Guid.Empty;

这并未按要求处理 DBNull。DBNull 与 null 不同。 - Nameless One
通常最好解释一下你的答案是如何工作的,这样提问者和社区中的其他人也可以从中学习。也许可以看一下 https://stackoverflow.com/help/how-to-answer - Nameless One

-1
如果从命令返回的对象是唯一标识符,则是的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接