使用 SqlDataReader

Posted

技术标签:

【中文标题】使用 SqlDataReader【英文标题】:Using SqlDataReader 【发布时间】:2015-04-09 13:40:36 【问题描述】:

我见过一些人使用SqlDataReader从数据库中获取数据

reader["Test"].ToString();
...

和其他人一样

reader.GetString(0);
...

有什么不同吗?还是归结为个人喜好?

【问题讨论】:

在执行此操作时最好使用第一个示例。如果列顺序发生变化,您很可能会出错。通常最好始终避免使用硬编码索引。 【参考方案1】:

很明显:

当您知道返回数据的列名时,应该使用第一个。对我来说,最好是第二个,因为可以更改列顺序。同样在这种情况下,您可以稍后转换返回对象的数据类型。 当您不知道这些名称(或者甚至列没有名称)时,第二个更可取,但可以确保您访问的列具有精确的数据类型。如果列数据类型不匹配 - 你会得到异常。因此,如果您不能按名称访问 colmn 并且不确定确切的数据类型,最好使用 GetValue 而不是 GetString 和其他类型的方法。对我来说,这种访问数据的方式只有在您的查询类似于“从某个表中选择 x,sum(y)”时才真正有用 - 即第二列没有名称,因此您无法按名称访问它。

考虑到性能 - 按名称访问需要稍微更多时间,因为在内部按索引访问是

public override object this[int i]

    get
    
        return this.GetValue(i);
    

按名称访问是

public override object this[string name]

    get
    
        return this.GetValue(this.GetOrdinal(name));
    

所以按名称访问首先调用GetOrdinal

但在真正的应用程序中,这种差异绝对可以忽略不计。

【讨论】:

对,有道理,谢谢你的详细回答 只是另一个小问题,我如何使用第一个示例读取 int 值? @Code well ,例如可以使用Convert.ToInt32(reader["Test"]); 好的,再次感谢 :)【参考方案2】:

使用字段名而不是索引总是有意义的,因为如果 SQL 语句中字段的顺序发生变化,您可能会遇到一些麻烦。

我更喜欢这样使用:DataReader.GetString() via columnname

【讨论】:

以上是关于使用 SqlDataReader的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)