使用 Sql Server 从 C# 中的读取器读取数据

Posted

技术标签:

【中文标题】使用 Sql Server 从 C# 中的读取器读取数据【英文标题】:Reading data from reader in C# with Sql Server 【发布时间】:2013-10-29 08:06:56 【问题描述】:

在 C# 中,通过整数索引还是通过命名索引,哪种方式更有效地读取 reader 对象?

ad.Name = reader.GetString(0);

ad.Name = reader["Name"].ToString();

【问题讨论】:

DataReader best-practices的可能重复 【参考方案1】:

name重载需要先找到索引。

MSDN

首先执行区分大小写的查找。如果失败,一秒钟 进行不区分大小写的搜索(进行不区分大小写的比较 使用数据库排序规则)。意外的结果可能会发生在 比较受特定于文化的大小写规则的影响。为了 例如,在土耳其语中,以下示例会产生错误的结果 因为土耳其语的文件系统不使用语言大小写 “文件”中字母“i”的规则。

来自Getordinal(因此使用):

因为基于序号的查找比命名查找更有效, 在循环中调用 GetOrdinal 是低效的。节省时间 调用一次 GetOrdinal 并将结果分配给一个整数 在循环中使用的变量。

所以在循环中查找序数索引一次并在循环体中重用它可能更有效。

但是,名称查找由 class 支持,该 HashTable 非常有效。

【讨论】:

【参考方案2】:

reader.GetString(index);

这将获取该列索引处的行值作为字符串,第二种解决方案更理想,因为它允许您以自己喜欢的类型获取该索引处的值。

示例:-

String name = reader["Name"].ToString();
int age = (int) reader["Age"]

【讨论】:

如果 int 或 string 索引器更有效,这将如何回答?【参考方案3】:
ad.Name = reader["Name"].ToString();

这是最有效的方法。

因为虽然你在后面修改了数据库表结构,但是因为你直接提到了列名,所以对这段代码没有影响。

但是对于列索引,当您在该列之前向表中添加任何列时,它会发生变化。

【讨论】:

这可能更具可读性且不易出错,但效率不高,因为它需要先找到序数。如果你在循环中这样做数百万次,那么将它放在循环之上会更有效

以上是关于使用 Sql Server 从 C# 中的读取器读取数据的主要内容,如果未能解决你的问题,请参考以下文章

将 c# 对象存储在 sql server 数据库中

c# sql server 读取数据库中最后一行的数据 然后每个字段的数据赋值给一个变量

[SQL] 理解SQL SERVER中的逻辑读,预读和物理读

C# 读取Sql Server中的NULL返回什么?

C# 读取Sql Server中的NULL返回什么?

访问从 SQL Server 中的 SQLCLR 存储过程返回的 SqlXml