2010-08-04 6 views
0

Je développe une application win.net qui fonctionne en continu sur une machine serveur. L'application sera connectée aux bases de données d'accès (mdb) résidant sur plusieurs machines client utilisant le fournisseur OLEDB Jet 4.0.Problème de connexion à Jet 4.0 avec l'application C# windows

Chaque base de données connectée était déjà utilisée par une autre application installée localement.

Mon application communique avec toutes les bases de données lorsque les machines clientes sont constamment actives.

Mais si une de mes machines client tombe en panne (disons système ou réseau) et redémarré, l'application ne peut pas se reconnecter à cette base de données spécifique, bien qu'elle soit accessible via le réseau.

Même j'ai essayé de redémarrer mon application par programme pour rétablir la connexion. Mais, il échoue également.

application renvoie juste

"Erreur disque ou réseau"

ou

"Erreur non spécifiée"

ou

« Impossible de démarrer l'application. Le travail Le fichier d'information du groupe est manquant ou ouvert exclusivement par un autre utilisateur. "

Quelqu'un?

+0

Un code peut vous aider. Essayez-vous de rouvrir la connexion après son retour en ligne? –

+1

Jet/ACE ne peut pas récupérer une connexion une fois qu'elle est perdue. C'est-à-dire, si l'ordinateur distant est redémarré, vous devez réinitialiser votre connexion à partir de zéro. Il n'y a pas de récupération, jamais. –

+0

Le commentaire de David était parfait. Jet est horrible en ce qui concerne sa capacité à récupérer à partir d'une connexion défaillante. Une perte d'un seul paquet annulera votre connexion. Nous recommandons à tous nos utilisateurs d'utiliser uniquement une base de données partagée sur un serveur réel (jamais le poste de travail d'un utilisateur) et JAMAIS de passer par une connexion VPN. –

Répondre

0

Oui.

En fait, j'utilise un objet statique avec le morceau de code suivant pour chacune des bases de données associées à l'application.

DbProviderFactory factory; 
DbConnection connection; 
DbDataAdapter dataAdapter; 

void SetConnection(ConnectionStringSettings settings) { 
    factory = DbProviderFactories.GetFactory(settings.ProviderName); 
    if (factory != null) { 
     if (connection == null) { 
      connection = factory.CreateConnection(); 
      dataAdapter = factory.CreateDataAdapter();      
      connection.ConnectionString = settings.ConnectionString; 
     } 
    } 
} 

public DataTable GetTable(string statement) { 
    DataTable dataTable = null; 
    if (connection != null) { 
     dataAdapter.SelectCommand = connection.CreateCommand(); 
     dataAdapter.SelectCommand.CommandText = statement; 
     dataTable = new DataTable(); 
     dataAdapter.Fill(dataTable); 
    } 
    else 
     throw new Exception("Connection object null"); 

    return dataTable; 
} 

Je définis la chaîne de connexion et le nom du fournisseur à partir du fichier app.config.