SqlDataReader这两个是相同的,哪个更快
本文关键字:两个 SqlDataReader | 更新日期: 2023-09-27 18:11:52
我正在处理SqlXml和返回xml而不是原始数据的存储过程。当返回的是xml且不知道列名时,如何实际读取数据呢?我使用了下面的版本,并且听说通过序号从SqlDataReader获取数据比通过列名更快。请给出最好的建议,并提供有效的理由或证据
-
sqlDataReaderInstance.GetString(0);
-
sqlDataReaderInstance[0];
并且听说通过序号比通过列名
从SqlDataReader获取数据要快。
您的两个示例都是通过索引(序数)获取数据,而不是列名:
通过列名获取数据:
while(reader.Read())
{
...
var value = reader["MyColumnName"];
...
}
可能比通过索引
获取数据要慢。int myColumnIndex = reader.GetOrdinal("MyColumnName");
while(reader.Read())
{
...
var value = reader[myColumnIndex];
...
}
,因为第一个示例必须重复查找与"MyColumnName"对应的索引。如果您有非常多的行,差异甚至可能是明显的。
在大多数情况下,这种差异不会很明显,所以要注意可读性。
如果您确实关心性能,使用序数的另一种选择是使用DbEnumerator类,如下所示:
foreach(IDataRecord record in new DbEnumerator(reader))
{
...
var value = record["MyColumnName"];
...
}
DbEnumerator
类读取一次模式,并维护一个内部HashTable,将列名映射到序数,这可以提高性能。
与从磁盘获取数据的速度相比,两者实际上是一样快的。
这两个调用是不相等的:带有索引器的版本返回一个对象,而GetString()
将对象转换为字符串,如果这是不可能的(即列是DBNull
),则抛出异常。
因此,尽管GetString()
可能稍微慢一些,但当您使用它时,无论如何都将转换为字符串。
考虑到以上所有情况,我会使用GetString()
。
Indexer
方法更快,因为它以本机格式返回数据并使用序数。
看看这些线程:
- SqlDataReader 性能最大化
- 。. NET SqlDataReader Item[] vs. GetString(GetOrdinal())?