ConnectionSsortingng perd le mot de passe après la connexion.Open

J’utilise ADO.NET pour obtenir des informations de la firebase database sur un serveur,
alors voici ce que je fais:

ssortingng conStr = "Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;Password=myPassword"; SqlConnection conn = new SqlConnection(conStr); conn.Open(); // do stuff conn.Close(); 

mais après avoir appelé la méthode Open , j’ai remarqué que conn.ConnectionSsortingng perd le mot de passe et devient:

 "Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;" 

ce qui provoque une exception avec n’importe quel afterword SqlCommand
Comment régler ceci?
Remarque: la chose étrange est que cela n’arrive pas toujours
Edit: je ne pense pas que cela a quelque chose à voir avec la commande elle-même mais de toute façon

 SqlCommand command = new SqlCommand("select GetDate()", conn); SqlDataReader reader = command.ExecuteReader(); 

Ceci est voulu, pour des raisons de sécurité. De MSDN :

ConnectionSsortingng est similaire à une chaîne de connexion OLE DB, mais n’est pas identique. Contrairement à OLE DB ou ADO, la chaîne de connexion renvoyée est identique à ConnectionSsortingng définie par l’utilisateur, moins les informations de sécurité si la valeur Persist Security Info est définie sur false (valeur par défaut). Le fournisseur de données .NET Framework pour SQL Server ne persiste pas et ne renvoie pas le mot de passe dans une chaîne de connexion, sauf si vous définissez Persist Security Info sur true.

Recherchez dans la chaîne de connexion. Pour conserver le mot de passe dans la propriété ConnectionSsortingng, vous devez append "Persist Security Info=true;" à la chaîne de connexion elle-même .

L’exemple suivant supprimera le mot de passe:

 ssortingng conStr = "Data Source=localhost;Initial Catalog=MyDatabase;User Id=MyUser;Password=MyPassword"; SqlConnection conn = new SqlConnection(conStr); conn.Open(); conn.Close(); Console.WriteLine(conn.ConnectionSsortingng); 

L’exemple suivant conservera le mot de passe dans conn.ConnectionSsortingng :

 ssortingng conStr = "Persist Security Info=True;Data Source=localhost;Initial Catalog=MyDatabase;User Id=MyUser;Password=MyPassword"; SqlConnection conn = new SqlConnection(conStr); conn.Open(); conn.Close(); Console.WriteLine(conn.ConnectionSsortingng); 

C’est une propriété définie dans la chaîne de connexion elle-même, pas dans l’object SqlConnection . Je la mets au début de la chaîne de connexion pour que vous n’ayez pas à la faire défiler pour la voir, elle peut aller n’importe où dans la chaîne de connexion, je vois habituellement à la fin.

Comme d’autres l’ont déjà dit, si vous devez le faire, vous n’utilisez probablement pas l’object SqlConnection exactement comme il était prévu.

Vous voudrez peut-être append votre propre validation, mais cela nécessitera une connexion SqlConnection standard (sans sécurité persistante) et l’access à la propriété privée ConnectionOptions pour récupérer la chaîne de connexion.

 public static ssortingng SqlConnectionToConnectionSsortingng(SqlConnection conn) { System.Reflection.PropertyInfo property = conn.GetType().GetProperty("ConnectionOptions", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); object optionsObject = property.GetValue(conn, null); System.Reflection.MethodInfo method = optionsObject.GetType().GetMethod("UsersConnectionSsortingng"); ssortingng connStr = method.Invoke(optionsObject, new object[] { false }) as ssortingng; // argument is "hidePassword" so we set it to false return connStr; } 

Notez que cela pourrait casser si MS change l’implémentation sous-jacente, car nous utilisons la reflection. Je ne conseille pas cela comme le meilleur moyen de le faire, mais c’est un moyen.