2010-07-12 8 views
1
 System.Data.SqlClient.SqlConnection foo = new System.Data.SqlClient.SqlConnection(); 
     foo.ConnectionString = "Data Source=myServer;Integrated Security=SSPI;"; // exception thrown on this line 

Si je déclare un nouvel objet SqlConnection dans mon code .net puis définissez le champ ConnectionString à une chaîne de connexion syntaxiquement invalide, une exception est levée.Comment l'objet .net SqlConnection vérifie-t-il qu'une chaîne de connexions est syntaxiquement valide?

J'ai vérifié plusieurs fois que si la chaîne de connexion est sémantiquement incorrecte (par exemple, nom de serveur invalide, mot de passe erroné), aucune exception n'est levée.

Quelle est la logique utilisée par l'objet SqlConnection pour valider la chaîne de connexion à ce stade? J'ai essayé en vain de répondre à cette question en utilisant RedGate Reflector.

+0

Je ne suis pas vraiment intéressé par Reflector en tant que je ne suis intéressé que par savoir ce que la classe fait pour vérifier ma chaîne de connexion. –

Répondre

0

Les chaînes de connexion doivent être une liste simple de paires nom = valeur, séparées par des points-virgules (;). Quelle exception obtenez-vous?

Si vous utilisez Reflector pour essayer de déterminer comment votre chaîne est analysée, vous trouverez peut-être plus facile de regarder System.Data.Common.DbConnectionStringBuilder. Le propre serveur SqlConnectionStringBuilder de SQL Server hérite de cette classe.

2

La logique de validation se trouve dans le constructeur à une seule chaîne interne de la classe SqlConnectionString, qu'elle frappe par une route plutôt détournée.

SqlConnection.ConnectionString ensemble des appels accesseurs de:

SqlConnection.ConnectionString_Set(string);    // Which calls -> 
DbConnectionFactory.GetConnectionPoolGroup(string, ...); // Which calls -> 
SqlConnectionFactory.CreateConnectionOptions(...);  // Which calls -> 
SqlConnectionString(string) // Constructor - take a look at this for details 

(Notez que le dernier appel est pas au constructeur unique chaîne pour SqlConnection - il est la construction d'une instance de une autre classe, SqlConnectionString.

+0

Le constructeur qui prend une chaîne pour un argument est juste une seule ligne qui dit 'this.ConnectionString = connectionString'. Cela se heurte à votre réponse. –

+0

@Rising Star - vous regardez la mauvaise classe. Je parle du constructeur pour 'SqlConnectionString', ** pas **' SqlConnection'. J'ai mis à jour ma réponse pour le souligner. –