2010-11-10 22 views
0

J'essaie d'utiliser un SqlDataReader (je suis tout à fait conscient de la beauté de Linq, etc, mais l'application que je construis est en partie un générateur Sql, donc Linq ne correspond pas à mes besoins). Malheureusement, je ne suis pas sûr des meilleures pratiques lors de l'utilisation de SqlDataReader. J'utilise le code comme suit dans plusieurs endroits dans mon code:Est-ce que SqlDataReader a un équivalent à Get * (int index) avec une clé de chaîne?

using (SqlDataReader reader = ...) 
{ 
    int ID = reader.GetInt32(0); 
    int tableID = reader.GetInt32(1); 
    string fieldName = reader[2] as string; 
    ...//More, similar code 
} 

Mais il se sent très instable. Si la base de données change (ce qui est en fait extrêmement improbable dans ce cas), le code rompt. Existe-t-il un équivalent à GetInt32, GetString, GetDecimal de SqlDataReader, qui prend un nom de colonne au lieu d'un index? Quelle est la meilleure pratique dans ce cas? Quel est le plus rapide? Ces parties de mon code sont les parties les plus gourmandes en temps de mon code (je l'ai profilé plusieurs fois) et donc la vitesse est importante.

[EDIT]

Je suis au courant d'utiliser l'indexeur avec une chaîne, je misworded ci-dessus. Je cours dans l'exécution lente. Mon code fonctionne bien, mais je cherche un moyen de récupérer quelques secondes dans ces boucles. L'accès par chaîne me ralentirait-il? Je sais que le db-access est la première opération intensive, il n'y a rien que je puisse faire, donc je veux réduire le temps de traitement pour chaque élément accédé.

[EDIT]

J'ai décidé de courir seulement avec GetOrdinal à moins que quelqu'un a des exemples plus concrets. Je vais tester l'efficacité plus tard. Je vais essayer de me souvenir de les poster quand je cours réellement les tests.

Répondre

4

La propriété indexer prend une clé de chaîne, vous pouvez donc procéder comme suit.

reader["text_column"] as string; 
Convert.ToInt32(reader["numeric_column"]); 

suggestion supplémentaire

Si vous êtes préoccupé par la recherche de chaîne étant lente, et en supposant recherche numérique est plus rapide, vous pouvez essayer d'utiliser GetOrdinal pour trouver les indices de colonne avant une boucle à travers un grand résultat ensemble.

int textColumnIndex = reader.GetOrdinal("text_column"); 
int numericColumnIndex = reader.GetOrdinal("numeric_column"); 
while (reader.Read()) 
{ 
    string text = reader[textColumnIndex] as string; 
    int number = Convert.ToInt32(reader[numericColumnIndex]); 
} 
+1

Utilisez plutôt int.Parse/TryParse. – Femaref

+0

Oui, je le savais. J'étais surtout curieux de la vitesse et si cela ralentirait encore plus les choses dans ma partie la plus intensive du code. – Crisfole

+0

@Femaref: pourquoi? Y a-t-il une différence appréciable entre Convert.ToInt32 et int.Parse que je ne connais pas? – batwad