使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)