2009-12-01 7 views
2

J'écris un petit framework en C# pour importer des données vers SQL Server.C# - SQL Server -? Oledb

J'ai remarqué que si vous essayez d'utiliser le? espace réservé pour les paramètres, ils ne fonctionnent pas si vous utilisez l'espace de noms System.Data.SqlClient. Toutefois, si vous utilisez l'espace de noms System.Data.OleDb pour travailler avec la base de données, ils fonctionnent très bien. (il vous suffit d'ajouter Provider = SQLOLEDB dans votre chaîne de connexion)

Donc j'ai quelques questions, parce que le? la syntaxe est requise par ma solution:

  1. Existe-t-il une alternative à l'utilisation de paramètres nommés avec System.Data.SqlClient? Je veux utiliser des paramètres ordonnés.
  2. Y a-t-il un impact sur les performances de l'utilisation d'un espace de noms (fournisseur ado) par rapport à l'autre?
  3. Y a-t-il une autre raison pour laquelle je préférerais un espace de noms plutôt qu'un autre?

Pour élaborer ce que je suis en train de faire, mon cadre va prendre une classe décorée avec des attributs personnalisés et générer des requêtes SQL comme ceci:

INSERT INTO myTable (col1, col2, ...) VALUES (?, ?, ...) 

Cette chaîne sera créée avec un IDbCommand et plusieurs IDataParameters et pour chaque ExecuteNonQuery il va simplement définir les valeurs sur les IDataParameters.

Des pensées? Edit: J'ai essayé d'utiliser des paramètres nommés comme p0, p1, etc. comme répondeur mentionné et ça marche plutôt bien sur SqlClient. Toutefois, si j'utilise OleDB, il erreur en disant:

"Must declare the scalar variable @p0." 

Mon paramètre est créé comme ceci:

new OleDbParameter("p" + index, GetType(attribute)); 
//GetType does work to get the correct SqlDbType 

Quel est le problème? J'ai également essayé d'ajouter et de supprimer le symbole @ dans le nom du paramètre en vain.

FINAL EDIT: Je viens d'utiliser Oledb? et SqlClient utilise des paramètres nommés. Je peux changer de fournisseur pour de nouveaux fournisseurs.

Répondre

5

Cest le comportement de ces classes. OleDb utilise?, Paramètre nommé SqlClient. Perfomance: Je n'ai pas de benchmarks, mais je pense que le SqlClient devrait mieux fonctionner avec un serveur SQL que OleDB. SqlClient est explicite pour Sql Server, OleDB pour tout type de Datasource (même Excel). Mais pls. Essaye le.

Avec SqlClient vous pouvez également avoir "paramètre ordonné". Appelez simplement le paramètre @ Param1, @ Param2, @ Param3 ....

+0

L'utilisation de paramètres nommés est légèrement plus compliquée pour certaines choses que je fais. Je souhaite éventuellement que mon framework fonctionne pour d'autres fournisseurs tels que Oledb (Excel ou Access), MySQL, etc. Est-ce que OleDb a des paramètres nommés? – jonathanpeppers

+0

Je suis d'accord avec tout ce qui précède (et lorsque j'utilise OLEDB j'utilise des params nommés de toute façon pour plus de clarté même si c'est seulement la position qui compte). – Murph

+0

@Jonathan - oui, comme je l'ai dit, vous pouvez utiliser des paramètres nommés dans OLE DB, c'est juste que la seule chose qui importe réellement est la position – Murph

0

Vous pouvez l'utiliser comme un arbitre pour les params

SqlCommand.Parameters Property

+0

Je préfère toujours les rechercher par index car il est plus rapide d'extraire un paramètre par index que son nom par une valeur de chaîne. – jonathanpeppers

+1

@ Jonathan: combien plus vite, à quel coût de maintenabilité, et avez-vous référencé? – gbn

+0

Mon cadre est destiné à la vitesse et je serais heureux de sacrifier la maintenabilité pour la vitesse dans ce cas. Une fois terminé, aucun changement ne devrait vraiment être nécessaire si ce n'est d'ajouter un support pour les autres fournisseurs de bases de données. – jonathanpeppers