从 DataReader 读取数据的通用方法

2024-04-21

我目前正在使用此方法从 DataReader 读取数据 -

private T GetValue<T>(object obj)
{
    if (typeof(DBNull) != obj.GetType())
    {
        return (T)obj;
    }
    return default(T);
}

将上述方法调用为 -

GetValue<int>(dataReader["columnName1"])
GetValue<string>(dataReader["columnName2"])
GetValue<float>(dataReader["columnName3"])

然而,当columnName3的值为7200000有错误
Invalid Cast Exception.

我正在考虑修改我的方法来替换 -

return (T)obj;

with

return (T)Convert.ChangeType(obj, typeof(T));

但期待更好的方法,因为此更改将涉及两次类型转换。
还有更好的想法吗?

谢谢你!


通用方法的优点是可以减少大量代码膨胀,但为每种数据类型制作自己的包装器可以让您灵活地进行自定义处理。与检索模式相比,您的数据库查询很可能会对性能产生显着的影响。

我建议您编写一组自己的扩展方法,而不是使用一种通用方法。将该方法扩展至IDataReader给您带来的好处是无需在整个对象子类型上传播方法。我必须单独处理类型,因为各种连接器的行为不同,尤其是Guid类型。也很难知道 datareader 是否读取了该值0 or DBNull当你回来的时候0对于这两种情况。假设您的表中有一个带有空值的枚举字段。为什么你希望它被读作第一个枚举?

只需致电:

dataReader.GetInt("columnName1")
dataReader.GetString("columnName3")
dataReader.GetFloat("columnName3")

以及方法:

public static int? GetInt(this IDataReader r, string columnName)
{
    var i = r[columnName];      
    if (i.IsNull())
        return null; //or your preferred value

    return (int)i;
}

public static bool IsNull<T>(this T obj) where T : class
{
    return (object)obj == null || obj == DBNull.Value;
}

同样,

public static string GetString(this IDataReader r, string columnName)
{
}

public static float GetFloat(this IDataReader r, string columnName)
{
}

如果您确实想要一个通用功能,您也可以拥有它。

public static T Get<T>(this IDataReader r, string columnName, T defaultValue = default(T))
{
    var obj = r[columnName];      
    if (obj.IsNull())
        return defaultValue;

    return (T)obj;
}

所以称之为

dataReader.Get<int>(1); //if DBNull should be treated as 0
dataReader.Get<int?>(1); //if DBNull should be treated as null
dataReader.Get<int>(1, -1); //if DBNull should be treated as a custom value, say -1

也就是说,错误是因为您没有使用注释中指出的正确类型进行转换。我本可以选择内置的DBNull检查,但我不会避免从读取器多次读取数据,受到这个奇怪的微优化案例的启发 https://stackoverflow.com/questions/221582/most-efficient-way-to-check-for-dbnull-and-then-assign-to-a-variable

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

从 DataReader 读取数据的通用方法 的相关文章

  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 使用 SWING 编写触摸屏应用程序

    我想知道应用程序 UI 中的按钮应该监听哪些事件 鼠标点击 那么按下和释放事件又如何呢 通过触摸屏点击时它们是否相同 谢谢 托梅尔 大多数触摸屏只是模拟鼠标 所以如果您的需求很简单 您不需要做任何特殊的事情 JButtons 仍然触发 Ac
  • 在 div 内滚动时如何在 jQuery 中使用scrollTop?

    The left is the what I m trying to scroll it scrolls just a little bit and then stops It seems to scroll the same amount
  • 如何使用我创建的 Visual Studio 2010 项目模板

    我跟着MSDN 上的步骤 http msdn microsoft com en us library xkh1wxd8 aspx用于创建模板 我在VS2010中创建了一个新项目 然后使用文件 gt 导出模板 创建我的模板的选项 我浏览了向导
  • 无法从“方法组”转换为“System.Action<对象>”错误

    我创建了以下函数 public void DelegatedCall Action delegatedMethod 并定义了以下方法 public void foo1 String str 但是 当我尝试打电话时DelegateCall w
  • 如何以最佳方式将 SQL 查询转换为 cypher?

    我是 neo4j 的新手 使用 3 0 版本 我有一个巨大的事务数据集 我将其转换为图形模型 我需要将下面的 SQL 查询转换为 cypher create table calc base as select a ticket id tic
  • 保存为自动填充对话框未显示

    我有一个显示用户名 UI 的活动 输入该活动并点击继续按钮后会显示输入密码 UI 输入密码并点击登录按钮后 完成当前活动并启动新活动 在我的设备上 我选择了 Google 自动填充服务 因此在第一个活动完成后 我想要 保存以供自动填充 对话
  • Maven AppAssembler 找不到类

    尝试修改现有的 Java Tomcat 应用程序以按照其部署在 Heroku 上tutorial https devcenter heroku com articles create a java web application using
  • has_many :autosave => true 保存子项时跳过验证

    在 Rails 2 和 Rails 3 中 如果 autosave gt true 是一个 has many 关联 则循环遍历集合并对每个子关联调用 save validate gt false 这是为什么 我们需要为该子对象运行 befo
  • 创建 SKShapeNode 的子类

    class ColorRectangle SKShapeNode var width CGFloat var height CGFloat var rectColor UIColor convenience init rectOfSize
  • 使用 NSValueTransformer 加密 iOS 核心数据

    我正在尝试使用 Core Data 和 CommonCrypto 加密数据 我正在尝试使用 NSValueTransformer 来延迟加密和解密 但是 当我现在尝试将加密数据保存到持久存储协调器时 它失败了 每次我尝试将数据保存到数据库时
  • RecyclerView - 获取 Activity 内的位置而不是 RecyclerView 适配器

    这是我处理视图点击的第三天 我原来用的是ListView 然后我切换到RecyclerView 我已经添加了android onclick我的每个控件的元素row layout我正在处理它们MainActivity像这样 public vo
  • Moment js - 获取日期而不考虑时区

    我确实阅读了不同的 StackOverflow 帖子 他们建议从一开始就使用 utc 但它不起作用 Note 我在 PST 区域 const start 2018 06 10T21 00 00 04 00 const end 2018 06
  • MS2015中的MvcBuildViews需要很长时间

    我们正在转换解决方案以使用新的 Roslyn 编译器 当我在发布模式下通过 teamCity 构建它时 MVCBuildViews 步骤仍然使用 aspnet compiler exe 并且预编译视图需要大约 15 分钟 在 NET 4 5
  • Factory_girl 与 validates_presence_of 有关系

    我有 2 个型号 user rb class User lt ActiveRecord Base has one profile dependent gt destroy end profile rb class Profile lt Ac
  • Linux 中允许的 c/c++ 最大互斥体数量

    我一直在尝试找出 Linux 中 c c 进程的最大互斥体数量是多少 但没有成功 另外 有没有办法修改这个数字 我正在读的书提到了如何找到Linux中允许的最大线程数以及如何修改这个数字 但没有提到互斥体 检查这个pthread mutex
  • Django Postgresql 在迁移时删除列默认值

    我面临表默认值的问题 例如我有这个模型 class model1 models Model field1 models CharField max length 50 default My Default Value 1 db column
  • 如何完全静音 bash 脚本中的 vlc 输出?

    我有一个为自己编写的脚本 它在接近结束的地方使用 vlc 我需要它停止输出它想要的任何内容 但保留我自己的输出 所以没有 清除 我使用了参数 q 和 no sout x264 quiet 但无济于事 它仍然输出丑陋的消息 即 警告 调用 r
  • 使用两个具有相同命名空间的 .NET 库

    我目前正在为一家公司维护一些旧代码 正如所发生的那样 我正在修改的当前应用程序使用旧版本的内部库 我们将其称为 Lib1 dll 他们还有一个名为 Lib2 dll 的新版本库 它在许多方面对以前的库进行了改进 不幸的是 Lib2 不向后兼
  • VBS 脚本 getElementbyID 错误(自动登录脚本)

    我正在编写适用于不同站点的 vbs 脚本文件 但我正在为我的大学网页编写用于互联网页面登录的自动登录脚本 所以我一直在工作直到填写用户名和密码 但我无法让它点击登录 这是大学登录的链接 我不确定您是否可以从网络外访问它 请注意编辑请不要将其
  • 从 DataReader 读取数据的通用方法

    我目前正在使用此方法从 DataReader 读取数据 private T GetValue