我正在使用SqlXml和返回xml而不是原始数据的存储过程。返回时实际读取数据的方式是xml,并且不知道列名。我使用了以下版本,并且听说通过序数从SqlDataReader获取数据比通过列名更快。请提供最佳且有正当理由或证据的建议
sqlDataReaderInstance.GetString(0);
sqlDataReaderInstance[0];
答案 0 :(得分:6)
并且听说通过序数从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,将列名称映射到序列,这可以提高性能。
答案 1 :(得分:4)
与从磁盘获取数据的速度相比,两者的速度都会相同。
两个调用不等效:带索引器的版本返回一个对象,而GetString()
将对象转换为字符串,如果不可能则抛出异常(即列为{{1} }})。
因此虽然DBNull
可能会稍微慢一点,但是当你使用它时,你仍然会转换为字符串。
考虑到上述所有情况,我会使用GetString()
。
答案 2 :(得分:1)
Indexer
方法更快,因为它返回native format中的数据并使用序数。
看看这些主题: