SqlDataReader 检查空值的最佳方法 -sqlDataReader.IsDBNull 与 DBNull.Value

2024-03-16

我想从数据库中检索十进制值,并且想知道检查空值的推荐方法。

我见过MSDN - DBNull.Value 字段 http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx该检查很少使用。

因此,是reader.IsDBNull检查空值的最佳/最有效方法?

我创建了 2 个示例方法:

public static decimal? GetNullableDecimal(SqlDataReader reader, string fieldName)
{
    if (reader[fieldName] == DBNull.Value)
    {
        return null;
    }
    return (decimal)reader[fieldName];
}

public static decimal? GetNullableDecimal_2(SqlDataReader reader, string fieldName)
{
    if (reader.IsDBNull(reader[fieldName]))
    {
         return null;
    }
    return (decimal)reader[fieldName];
}

大多数时候这些字段将为空。

提前致谢!


我不会太纠结于哪种方法更好,因为这两种方法都有效,而且我以前在代码中使用过这两种方法。

例如,这是我从我的一个旧项目中挖掘出来的实用函数:

/// <summary>
/// Helper class for SqlDataReader, which allows for the calling code to retrieve a value in a generic fashion.
/// </summary>
public static class SqlReaderHelper
{
    private static bool IsNullableType(Type theValueType)
    {
        return (theValueType.IsGenericType && theValueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
    }

    /// <summary>
    /// Returns the value, of type T, from the SqlDataReader, accounting for both generic and non-generic types.
    /// </summary>
    /// <typeparam name="T">T, type applied</typeparam>
    /// <param name="theReader">The SqlDataReader object that queried the database</param>
    /// <param name="theColumnName">The column of data to retrieve a value from</param>
    /// <returns>T, type applied; default value of type if database value is null</returns>
    public static T GetValue<T>(this SqlDataReader theReader, string theColumnName)
    {
        // Read the value out of the reader by string (column name); returns object
        object theValue = theReader[theColumnName];

        // Cast to the generic type applied to this method (i.e. int?)
        Type theValueType = typeof(T);

        // Check for null value from the database
        if (DBNull.Value != theValue)
        {
            // We have a null, do we have a nullable type for T?
            if (!IsNullableType(theValueType))
            {
                // No, this is not a nullable type so just change the value's type from object to T
                return (T)Convert.ChangeType(theValue, theValueType);
            }
            else
            {
                // Yes, this is a nullable type so change the value's type from object to the underlying type of T
                NullableConverter theNullableConverter = new NullableConverter(theValueType);

                return (T)Convert.ChangeType(theValue, theNullableConverter.UnderlyingType);
            }
        }

        // The value was null in the database, so return the default value for T; this will vary based on what T is (i.e. int has a default of 0)
        return default(T);
    }
}

Usage:

yourSqlReaderObject.GetValue<int?>("SOME_ID_COLUMN");
yourSqlReaderObject.GetValue<string>("SOME_VALUE_COLUMN");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SqlDataReader 检查空值的最佳方法 -sqlDataReader.IsDBNull 与 DBNull.Value 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • JFreeChart 不会在线程上的每次迭代时显示图形?

    我使用线程在一个类中获取计数器值并写入JFreeChart在另一个线程中 执行时 它交替工作 但只显示最后的图形 它还将 y 轴标签值显示为 Float 但实际检索值是 int 我该如何解决这些问题 XYDataset Dataset Ti
  • 在 Rails 中,哪里是放置需要“随处”可用的方法的正确位置

    我已经将许多小实用方法 例如用于重新格式化或解析字符串等简单对象 放入了 ApplicationHelper 中 但是 模型中的类方法显然无法访问 ApplicationHelper 方法 有一个解决方法 那就是在我的项目中进行洒水 inc
  • 在 Java 中动态加载模块(类)的最佳方法

    我目前正在编写一个需要在不同类型的设备上运行的应用程序 我的方法是制作一个 模块化 应用程序 可以根据需要操作的设备动态加载不同的类 为了使应用程序易于扩展 我的目标是为附加模块 jar 或 class 文件 分配特定路径 而核心程序保持原
  • 如何获取和设置当前网页滚动位置?

    如何获取和设置当前网页滚动位置 我有一个很长的表单 需要根据用户操作 输入进行刷新 发生这种情况时 页面会重置到最顶部 这对用户来说很烦人 因为他们必须向下滚动回到原来的位置 如果我可以在页面重新加载之前捕获当前滚动位置 在隐藏输入中 那么
  • 如何列出包中的所有类和方法/函数 - 具有完整的文件夹/文件路径?

    为了更好地理解包的结构 假设我们有一些包 模块 比如说 somemodule 结构如下 somemodule file1 py fo x a function file2 py bar x a function dir1 file3 py
  • 在 Rails 应用程序中实现投票的最佳方式?

    目前在 Rails 站点上实现投票的最佳插件是什么 我知道的两个是 vote fu http github com peteonrails vote fu 行为可投票 http github com ryanto acts as votab
  • JPA CriteriaBuilder 案例查询

    任何人都可以提供如何使用编写案例查询的示例CriteriaBuilder 以下是使用的示例案例表达式CriteriaBuilder 这适用于 JPA 2 Hashtable caseTable new Hashtable 3 caseTab
  • Jquery视差滚动效果-多方向

    我需要为客户构建一个多方向 JQuery 视差页面 他们基本上希望它以与此类似的方式工作 https victoriabeckham landrover com INT https victoriabeckham landrover com
  • 从 shell 脚本获取 pytest 退出代码

    我正在从 shell 脚本运行 pytest 测试 脚本中的相关行类似于 pytest pytest tests param my param 根据 pytest 文档 运行 pytest 可能会导致六种不同的退出代码 0 5 我的问题是如
  • PHP 数组插入无法按预期工作

    我正在尝试插入一些项目 假设nitems 它们都彼此不同 到一个数组 不知何故 最终的数组包括n items 它们都是相同的项目 最后插入的项目 这是我的代码 searchResults data foreach allowSearch a
  • 当应用程序在后台时获取本地通知

    当应用程序在后台时 不会调用 didReceive Local notification 所以我尝试从 didFinishLaunchingWithOptions 获取通知 BOOL application UIApplication ap
  • 使用 ffmpeg 创建视频

    我有 100 张图像 PNG 我想使用这些图像创建一个视频 我为此使用 ffmpeg 库 使用命令行我可以轻松创建视频 但是我如何通过编码来做到这一点呢 任何帮助将不胜感激 pragma GCC diagnostic ignored Wde
  • 为什么我不应该对 TD(表格单元格)上的数字使用已弃用的align='right'?

    我指的是用于显示表格数据的表格的用法 例如 电子表格 重点关注numbers 我感觉并在用户体验中查看 https ux stackexchange com a 24073应该右对齐 格式正确 具有相同的小数位数 以方便求和 对于数字来说
  • 带组的 Google 柱形图

    我的数据格式 Group Count Month Year A 10 February 2015 B 8 February 2015 C 15 February 2016 我将使用过滤器来显示按组列分隔的每个月的数据 X axis会有团体
  • 将固定大小的 Map 序列化为 CBOR

    我有以下 JSON 2 c true 3 p 10 我想转换为 CBOR 格式 根据 cbor me 我有以下输出 82A102A16163F5A103A161700A 但是 当使用 Jackson Binary CBOR Serializ
  • GCC链接器找不到标准库?

    我一直在使用 XCode 开发一个学校项目 最终产品必须以带有 makefile 的源代码形式提交 因此我编写了一个 makefile 并开始以这种方式进行编译 以确保我有一个工作副本 这是我的生成文件 all main o StackLi
  • 如何扩展具有动态形成选择器的类/混合

    如何扩展使用 组合器动态形成的 Less 类 less 产生预期输出 hello world color red foo extend hello world font size 20px 预期的 CSS 输出 hello world fo
  • pandas 数据框任意两列之间的百分比差异

    我想定义一个函数来计算任意两个 pandas 列之间的百分比差异 假设我的数据框是由以下定义的 R1 R2 R3 R4 R5 R6 A B 1 2 3 4 我希望我的计算定义为 df R7 df R3 R4 apply method cal
  • 如何分组并根据总和过滤数据框?

    所以我有一个数据框 milk countries exports 它由以下列组成 期间 特定行的年份和月份 数据集是一年中的逐月 正在做出口的 记者 国家 从 报告者 进口的 伙伴 国家 商品 由 2 项组成 既不浓缩也不加糖的牛奶和奶油
  • SqlDataReader 检查空值的最佳方法 -sqlDataReader.IsDBNull 与 DBNull.Value

    我想从数据库中检索十进制值 并且想知道检查空值的推荐方法 我见过MSDN DBNull Value 字段 http msdn microsoft com en us library system dbnull value aspx该检查很少