Je traite une application C# avec un backbone EntityFramework utilisant un DbContext. L'application a deux choix: se connecter à un serveur SQL distant express ou se connecter à une base de données SQL locale compacte 4.0 dans le cas où la connexion réseau n'est pas disponible. Lorsque mon application démarre, un thread vérifie si une connexion à la base de données distante est possible. Sinon, il doit automatiquement changer la chaîne de connexion et le fournisseur afin de se connecter à la base de données locale. Jusqu'à présent, j'essayais de résoudre ce problème en modifiant la section de chaîne de connexion dans app.config et en forçant l'application à actualiser la section, après avoir enregistré la configuration. Cette approche n'est pas la meilleure car j'ai besoin d'avoir des droits d'accès pour écrire dans le fichier app.config. Pourriez-vous suggérer une meilleure approche?Commutation automatique de la chaîne de connexion sur l'erreur de connexion à la base de données
Répondre
Le constructeur DbContext accepte soit le nom de la connexion chaîne, ou la chaîne de connexion réelle que vous voulez choisir. Ce que vous pouvez faire, c'est tester votre chaîne de connexion initiale - peut-être avec une connexion ado rapide ou quelque chose de simple, et puis si elle se connecte, utilisez-la, sinon connectez-vous avec l'autre.
Certains pseudo-code:
YourDbContext YourContext;
if (TestConnection())
{
YourContext = new YourDbContext("ConnectionString1");
}
else
{
YourContext = new YourDbContext("ConnectionString2");
}
Comment définir le fournisseur de base de données? J'ai besoin de basculer entre un SQL Server Express et un SQL compact 4.0 – Francesco
La référence à "ConnectionString" peut être le nom d'une chaîne de connexion dans votre app.config. Si possible, j'aurais juste les deux chaînes de connexion là-bas, et les référencer par leur nom. –
Je ne peux pas avoir les chaînes dans le app.config, j'ai besoin de les spécifier par programme. J'ai essayé d'insérer dans la chaîne le databaseName et ai récupéré une exception "mot-clé non valide: base de données". Comment cela pourrait-il être résolu? – Francesco
Wrap la gestion des chaînes de connexion dans une classe, faire cette classe un singleton, et l'utiliser pour obtenir la chaîne de connexion active, comme ceci:
public delegate void ConnectionChangedEventHandler(object sender, EventArgs e);
class ConnStringManager {
static public ConnStringManager Instance {get;private set;}
static {
Instance = new ConnStringManager();
}
public event ConnectionChangedEventHandler Changed;
private readonly string localConn;
private readonly string remoteConn;
public string ConnectionString {get; private set;}
private ConnStringManager() {
localConn = ... // Get local connection string from the config
remoteConn = ... // Get remote connection string from the config
TestAndSetConnectionString();
}
public void TestAndSetConnectionString() {
bool canUseRemote = true;
if (...) {
// Do some testing to see if remote DB is accessible
}
// Switch the connection string
var nextString = canUseRemote ? remoteConn : localConn;
bool changed = nextString != ConnectionString;
ConnectionString = nextString;
if (changed && Changed != null) {
Changed(this, EventArgs.Empty);
}
}
}
Merci pour votre réponse. Cette approche de conception semble propre et efficace mais, à côté de l'encapsulation de l'ensemble dans une classe, mon problème en est un autre: comment dire au moteur entityframework que j'ai changé la chaîne de connexion et le fournisseur DB? – Francesco
@Francesco Vous pouvez ajouter un événement 'Changed' pour permettre aux utilisateurs de voir les changements. Voir les modifications pour plus de détails. – dasblinkenlight
- 1. Reconnexion automatique de la connexion à la base de données
- 2. C# chaîne de connexion à la base de données
- 3. connexion à la base de données de connexion dans ruby
- 4. Échappement de chaîne sans connexion à la base de données
- 5. Chaîne de connexion VB.net à la base de données SQL
- 6. Connexion à la base de données dynamique
- 7. Connexion à la base de données SAAS
- 8. Chaîne de connexion à la base de données Python avec la base de données Derby
- 9. Connexion de la connexion de base de données expiré
- 10. Laravel Connexion à la base de données
- 11. Connexion locale à la base de données
- 12. Connexion à la base de données Oracle
- 13. Dépannage de la connexion à la base de données
- 14. AJAX - connexion à la base de données
- 15. connexion à la base de données asp.net
- 16. Connexion à la base de données OLEDB
- 17. Remarque: Conversion de chaîne à chaîne sur la connexion de base de données PDO
- 18. connexion à la base de données PostGIS
- 19. Connexion php à la base de données
- 20. C# connexion à la base de données
- 21. connexion à la base de données
- 22. Orchard connexion à la base de données
- 23. Connexion à la base de données PHPBB
- 24. Connexion à la base de données abandonnée
- 25. Connexion à la base de données MySQL
- 26. Connexion à la base de données Avaya
- 27. Connexion WMB à la base de données
- 28. Connexion à la base de données DSNLess
- 29. Connexion à la base de données SQL
- 30. Connexion à la base de données PHP
Où stockez-vous les deux chaînes de connexion? – pleinolijf
En deux constantes dans une classe – Francesco