20

使用以下语法从 SqlDataReader 读取值有什么区别:

Dim reader As SqlClient.SqlDataReader
reader("value").ToString()

或者

Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
4

4 回答 4

16

我认为使用 GetOrdinal() 的原因是您可以缓存结果并多次重复使用以提高性能。

例如

Dim reader As SqlClient.SqlDataReader
int valueOrdinal = reader.GetOrdinal("value");
while ( ... )
{
    var value = reader.GetString(valueOrdinal);
}
于 2009-07-03T13:33:58.327 回答
8

GetOrdinal首先执行区分大小写的查找。如果失败,则进行第二次不区分大小写的搜索。GetOrdinal对假名宽度不敏感。因为基于序数的查找比命名查找更有效,所以GetOrdinal在循环内调用效率低下。通过调用GetOrdinal一次并将结果分配给一个整数变量以在循环中使用来节省时间。

来源:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

于 2009-07-03T13:34:57.030 回答
3

我只想补充一点,您期望有多少记录的上下文起着重要作用,因为如果您返回单行,那么这两者之间的性能差异不会很大。但是,如果您要遍历许多行,那么使用类型访问器会更好地提高性能,因为它已经过优化。因此,在这种情况下,如果您需要通过使用列名来获得最佳性能,请调用 GetOrdinal 一次,将其放入变量中,然后在循环中使用类型访问器和列序号。这将产生最佳性能。

如果您对性能差异感到好奇,请查看我的博客文章

于 2012-12-20T02:06:50.110 回答
0

您的里程可能会有所不同,但...

您获取的行越多,您将看到更多的性能改进。我喜欢在我的 SELECT 语句中使用列别名,比如

select
    physical_column_name as "MyFieldName"

并写了一个方法,应该是不言自明的,

public Dictionary<String, Int32> GetOrdinalsByName(DbDataReader reader)

那么,我的作业看起来像

    public void BindRow(DbDataReader dr)
    {
        TerminationDate = dr.GetDateTime(_columnOrdinals["TerminationDate"]);

字典执行接近 O(1);因此,这是性能和可维护性之间的合理权衡。

于 2018-07-09T20:00:59.797 回答