4

我正在使用 SqlXml 和返回 xml 而不是原始数据的存储过程。返回时如何实际读取数据是一个xml并且不知道列名。我使用了以下版本,听说通过序数从 SqlDataReader 获取数据比通过列名更快。请就哪个最好并有正当理由或证据提出建议

  1. sqlDataReaderInstance.GetString(0);

  2. sqlDataReaderInstance[0];

4

3 回答 3

7

并且听说通过序数从 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,这可以提高性能。

于 2011-10-20T05:53:42.447 回答
4

与从磁盘获取数据的速度相比,两者实际上都一样快。

这两个调用是不等价的:带有索引器的版本返回一个对象,而GetString()将对象转换为字符串,如果这是不可能的则抛出异常(即列是DBNull)。

因此,尽管GetString()可能会稍微慢一些,但在使用它时无论如何都会转换为字符串。

鉴于以上所有我会使用GetString().

于 2011-10-20T05:39:33.290 回答
1

Indexer方法更快,因为它以本机格式返回数据并使用序数。

看看这些线程:

  1. 使用 SqlDataReader 最大化性能
  2. .NET SqlDataReader Item[] 与 GetString(GetOrdinal())?
于 2011-10-20T05:38:37.807 回答