使用以下语法从 SqlDataReader 读取值有什么区别:
Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
或者
Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
使用以下语法从 SqlDataReader 读取值有什么区别:
Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
或者
Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
我认为使用 GetOrdinal() 的原因是您可以缓存结果并多次重复使用以提高性能。
例如
Dim reader As SqlClient.SqlDataReader
int valueOrdinal = reader.GetOrdinal("value");
while ( ... )
{
var value = reader.GetString(valueOrdinal);
}
GetOrdinal
首先执行区分大小写的查找。如果失败,则进行第二次不区分大小写的搜索。GetOrdinal
对假名宽度不敏感。因为基于序数的查找比命名查找更有效,所以GetOrdinal
在循环内调用效率低下。通过调用GetOrdinal
一次并将结果分配给一个整数变量以在循环中使用来节省时间。
来源:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx
我只想补充一点,您期望有多少记录的上下文起着重要作用,因为如果您返回单行,那么这两者之间的性能差异不会很大。但是,如果您要遍历许多行,那么使用类型访问器会更好地提高性能,因为它已经过优化。因此,在这种情况下,如果您需要通过使用列名来获得最佳性能,请调用 GetOrdinal 一次,将其放入变量中,然后在循环中使用类型访问器和列序号。这将产生最佳性能。
如果您对性能差异感到好奇,请查看我的博客文章
您的里程可能会有所不同,但...
您获取的行越多,您将看到更多的性能改进。我喜欢在我的 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);因此,这是性能和可维护性之间的合理权衡。