SqlDataReader是这两个相同哪一个更快

Dee*_*ons 4 c# sql ado.net sqlxml sqldatareader

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

  1. sqlDataReaderInstance.GetString(0);

  2. sqlDataReaderInstance[0];

Joe*_*Joe 6

并且听说通过序数从SqlDataReader获取数据比通过列名更快

您的示例都是通过索引(序号)获取数据,而不是列名:

通过列名获取数据:

while(reader.Read())
{
    ...
    var value = reader["MyColumnName"];
    ...
}
Run Code Online (Sandbox Code Playgroud)

可能比通过索引获取数据要慢:

int myColumnIndex = reader.GetOrdinal("MyColumnName");
while(reader.Read())
{
    ...
    var value = reader[myColumnIndex];
    ...
}
Run Code Online (Sandbox Code Playgroud)

因为第一个例子必须重复找到对应于"MyColumnName"的索引.如果您有非常多的行,那么差异甚至可能会很明显.

在大多数情况下,差异不会明显,因此有利于可读性.

UPDATE

如果您真的关心性能,使用序数的替代方法是使用DbEnumerator类,如下所示:

foreach(IDataRecord record in new DbEnumerator(reader))
{
    ...
    var value = record["MyColumnName"];
    ...
}
Run Code Online (Sandbox Code Playgroud)

DbEnumerator类读取模式一次,并认为列名映射到序数,从而提高性能的内部哈希表.