我正在使用 SqlXml 和返回 xml 而不是原始数据的存储过程。返回时如何实际读取数据是一个xml并且不知道列名。我使用了以下版本,听说通过序数从 SqlDataReader 获取数据比通过列名更快。请就哪个最好并有正当理由或证据提出建议
sqlDataReaderInstance.GetString(0);
sqlDataReaderInstance[0];
我正在使用 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
方法更快,因为它以本机格式返回数据并使用序数。
看看这些线程: