C# - SQLDataReader by Index vs. SQLDataReader.GetOrdinal(ColumnName)

And*_*ese 6 c# sql asp.net ado.net sqldatareader

一个被认为是更好的标准吗?一个比另一个快吗?或者,主要是偏好?GetOrdinal很好,因为您可以自己调用列名,而不必担心计算 SQL 中字段的索引,但我想知道使用一种方法是否有好处。

按索引读取:

            while (reader.Read())
            { 
                Column1 = reader.GetValue(0).ToString().Trim();
                Column2 = reader.GetValue(1).ToString().Trim();
            }
Run Code Online (Sandbox Code Playgroud)

Reader.GetOrdinal:

           while (reader.Read())
           {
               data.Column1 = reader.GetValue(reader.GetOrdinal("COLUMN1")).ToString();
               data.Column2 = reader.GetValue(reader.GetOrdinal("COLUMN2")).ToString();
               data.Column3 = reader.GetDateTime(reader.GetOrdinal("COLUMN3"));
           }
Run Code Online (Sandbox Code Playgroud)

D-S*_*hih 3

reader.GetOrdinal(string)将在给定列名称的情况下获取列序号

我们可以从SqlDataReaderGetOrdinal中看到源代码,它将返回一个索引(字段是一个类)_fieldNameLookup.GetOrdinal_fieldNameLookupFieldNameLookup

_fieldNames是一个哈希表存储索引,通过区分大小写进行匹配

override public int GetOrdinal(string name) {
    SqlStatistics statistics = null;
    try {
        statistics = SqlStatistics.StartTimer(Statistics);
        if (null == _fieldNameLookup) {
            CheckMetaDataIsReady();
            _fieldNameLookup = new FieldNameLookup(this, _defaultLCID);
        }
        return _fieldNameLookup.GetOrdinal(name); // MDAC 71470
    }
    finally {
        SqlStatistics.StopTimer(statistics);
    }
}
Run Code Online (Sandbox Code Playgroud)

GetOrdinal我们可以从类中看到源代码方法FieldNameLookup

public int GetOrdinal(string fieldName) { // V1.2.3300
    if (null == fieldName) {
        throw ADP.ArgumentNull("fieldName");
    }
    int index = IndexOf(fieldName);
    if (-1 == index) {
        throw ADP.IndexOutOfRange(fieldName);
    }
    return index;
}

public int IndexOf(string fieldName) { // V1.2.3300
    if (null == _fieldNameLookup) {
        GenerateLookup();
    }
    int index;
    object value = _fieldNameLookup[fieldName];
    if (null != value) {
        // via case sensitive search, first match with lowest ordinal matches
        index = (int) value;
    }
    else {
        // via case insensitive search, first match with lowest ordinal matches
        index = LinearIndexOf(fieldName, CompareOptions.IgnoreCase);
        if (-1 == index) {
            // do the slow search now (kana, width insensitive comparison)
            index = LinearIndexOf(fieldName, ADP.compareOptions);
        }
    }
    return index;
}
Run Code Online (Sandbox Code Playgroud)

一个比另一个快吗?

如果您已经知道列存在索引号,reader.GetValue(0)那么速度会更快reader.GetValue(reader.GetOrdinal("COLUMN1")),因为它不会导致资源从方法获取列索引reader.GetOrdinal

是否被认为是更好的标准?

没有比较标准,因为 reader.GetValue(0)并且 reader.GetValue(reader.GetOrdinal("COLUMN1"))正在做同样的事情,就像之前的答案一样。

reader.GetValue(reader.GetOrdinal("COLUMN1"))那么阅读起来会更好 reader.GetValue(0),因为列名会更好地了解索引。