2009-07-03 5 views
16

Quelle est la différence entre la lecture d'une valeur d'un SqlDataReader en utilisant cette syntaxe:Pourquoi utiliser la GetOrdinal() de SqlDataReader

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

OU

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

Répondre

11

Je pense que la raison d'utiliser GetOrdinal() permet de mettre en cache le résultat et de le réutiliser plusieurs fois pour améliorer les performances.

E.g.

Dim reader As SqlClient.SqlDataReader 
int valueOrdinal = reader.GetOrdinal("value"); 
while (...) 
{ 
    var value = reader.GetString(valueOrdinal); 
} 
+0

performance Quelqu'un at-il une idée de l'impact sur les performances de l'utilisation GetOrdinal (..) à l'intérieur boucle de la ligne par rapport à, par exemple la récupération de données réelles de DB? –

+3

J'ai un test performamce pour un service Web API qui lit environ 30-40 enregistrements de DB stocké proc (avec plusieurs jeux de résultats) et retourne Json d'environ 8K taille. Dans ce test, j'ai remplacé GetOrdinal() par des constantes statiques et j'ai donc obtenu 2% d'augmentation des performances ... cela vaut-il donc la peine de créer un tel cache de noms de colonnes? - Je suppose que dans la plupart des scénarious pas. La lecture des données de la DB et la sérialisation des données vers Json dans de vrais scenarious influenceront davantage les performances, donc je pense que la mise en cache des ordinaux sera la dernière chose à faire lorsque vous avez déjà optimisé tout le reste ... –

5

GetOrdinal effectue une recherche sensible à la casse en premier. En cas d'échec, une seconde recherche insensible à la casse est effectuée. GetOrdinal est insensible kana-width.Bec les recherches ordinales sont plus efficaces que les recherches nommées, il est inefficace d'appeler GetOrdinal dans une boucle. Gagnez du temps en appelant GetOrdinal une fois et en affectant les résultats à une variable entière à utiliser dans la boucle.

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

+8

Copie Word to Word de http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx ;-) – jpoh

+1

@jpoh, rien de mal à cela, généralement. – Malfist

+5

Eh bien, au moins l'attribuer. – jpoh

1

Je veux juste ajouter que le contexte de nombre d'enregistrements que vous attendez joue un grand rôle parce que si vous retournez une seule ligne, alors la différence de performance entre ces deux ne seraient pas significatives. Toutefois, si vous parcourez plusieurs lignes, l'utilisation d'un accesseur typé est préférable pour les performances, car il est optimisé. Donc, dans ce cas, si vous avez besoin d'obtenir les meilleures performances en utilisant un nom de colonne, appelez GetOrdinal une fois, placez-le dans une variable, puis utilisez l'accesseur tapé avec l'ordinal de colonne dans votre boucle. Cela donnerait la meilleure performance.

si vous êtes curieux de savoir la différence consultez my blog post

Questions connexes