2009-09-11 12 views
1

J'ai des problèmes avec l'une de nos applications. C'est le processus .NET 3.5 32 bits. Au démarrage, nous ouvrons un .mdb pour lire quelques valeurs de "métadonnées". Cela fonctionne sur des centaines de systèmes, mais nous avons un client avec un TabletPC et des problèmes. Le système d'exploitation est Windows XP Tablet PC SP3, 32 bits, bla bla. Rien d'inhabituel. Il a .NET 3.5 (à partir de Windows Update) Tous à jour. Rien d'extraordinaire.L'ouverture d'une connexion OleDB simple déclenche une exception OutOfMemory?

Depuis notre application fait « quelques choses » lors du démarrage, j'ai créé l'application de la console la plus simple jamais:

namespace TestAccessConnection 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      OleDbConnection connection; 
      try 
      { 
       connection = 
        new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=metadata.mdb;Persist Security Info=False"); 
       connection.Open(); 
       connection.Close(); 
       Console.Read(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
       Console.Read(); 
      } 
     } 
    } 
} 

Résultats:

Si nous exécutons que .exe unique sans le fichier " metadata.mdb "dans le même chemin, nous obtenons l'évidence:" fichier non trouvé bla bla bla ". C'est correct

Si nous copions les métadonnées (plus sur les métadonnées plus tard), nous obtenons ceci:

System.OutOfMemoryException: An exception of type 'System.OutOfMemoryException' has occurred. 
    at System.Data.Common.ADP.IsSysTxEqualSysEsTransaction() 
    at System.Data.Common.ADP.NeedManualEnlistment() 
    at System.Data.OleDb.OleDbConnection.Open() 
    at TestAccessConnection.Program.Main(String[] args 

Note: l'exception était en espagnol et je l'ai traduit, mais le contenu reste le même, la seules les différences étaient les "une exception de type", mais les espaces de noms sont intacts

Qu'est-ce qu'il y a dans les métadonnées?: C'est un simple fichier MS ACCESS 2000 avec une table et quelques enregistrements (il stocke différentes chaînes de connexion MS-SQL sous forme cryptée), donc au démarrage, nous pouvons lire les connexions, les décrypter et présenter une liste pour le l'utilisateur à choisir différentes connexions. Aucune de cette fonctionnalité est présente (ou exécutée) dans le programme de test, je l'ai créé, depuis

l'exception est levée (apparemment) dans le connection.Open() En savoir plus sur cet ordinateur en particulier La boîte semble normal. Nous avons réinstallé .NET à partir de différentes sources (Windows Update) et le dotnetfx.exe (le gros fichier 250mb) et même exécuté une "réparation" à partir de ce gros installateur .net. .NET semble fonctionner, puisque cette petite application console cible .NET 3.5.

Pourquoi ce test? La raison pour laquelle l'application console ne fait que parce que notre propre application fait (entre autres) que dès qu'elle commence à exécuter Main(), c'est l'une des premières choses que nous faisons, alors j'ai isolé ce morceau de code et découvert que l'exception est lancée là. Afin de s'assurer que rien de notre code n'avait quelque chose à faire, j'ai créé l'application de test et trouvé l'exception étrange.

Qu'en est-il de Google? J'ai cherché frénétiquement google/SO/etc. en vain. OutOfMemory est un terme de recherche très trompeur, même lorsqu'il est associé à oledb et à d'autres mots clés «possibles» («je pourrais manquer quelque chose). Si vous tentez d'effectuer une recherche à l'aide d'autres parties des espaces de noms, vous obtiendrez des résultats bizarres qui ne semblent pas liés à ce problème particulier.

Quelle est la question? Oh, c'est simple: des idées?

Catch J'essaie d'éviter de réinstaller l'ensemble de Windows (qui pourrait aussi bien résoudre le problème, étant donné que cette chose simple fonctionne sur des centaines d'autres ordinateurs). La boîte ne semble pas être infectée par un logiciel malveillant ou similaire, c'est un Tablet PC utilisé dans les soins de santé, de sorte que l'accès à Internet bien que «ouvert» est rarement utilisé si utilisé. Cela ne signifie pas que la boîte est propre à 100% (vous ne pouvez jamais être sûr avec Windows). Si vous connaissez ou avez connu ce problème (et trouvé une solution), s'il vous plaît éclairer moi.

Merci d'avance!

+0

Alors que je suis tout pour les personnes utilisant Jet/ACE comme un magasin de données dans un certain nombre d'environnements de programmation, n'est-ce pas exagéré pour l'utilisateur que vous faites? Pourquoi pas un fichier XML à la place? Car une si petite quantité de données ne serait-elle pas beaucoup plus facile? –

+0

Oui, bien que vous devez tenir compte du fait que cela a été créé il y a presque six ans. Un petit .mdb était un moyen facile et pratique de stocker une table simple. Peut-être qu'il est temps de le remplacer (spécialement maintenant que nous savons qu'il n'y aura pas de bits JET64). ;) –

+0

Avez-vous essayé la connexion à d'autres sources de données oledb? un autre fichier msaccess? le même fichier avec un autre nom? Je sais que ma question peut sembler stupide, mais votre problème est assez surprenant. Si rien n'apparaît, je suivrais alors les conseils de DWF et choisirais un fichier XML comme autre moyen de stocker les données. –

Répondre

0

Ceci est mort depuis plus d'un an maintenant, et j'ai depuis porté le code pour utiliser un seul petit fichier XML. Nous n'avons eu aucun problème depuis lors. Fondamentalement, l'application démarre et si elle ne détecte pas le XML, elle recherche la MDB, si elle le trouve, elle essaie de l'ouvrir (toujours chercher des erreurs possibles), si elle peut l'ouvrir, elle lit le contenu et crée le XML, l'enregistre et ferme le MDB pour toujours :)

Jusqu'à présent, il a travaillé avec plus de 1000 machines, mais la cause de l'erreur de mémoire est encore inconnue.

Questions connexes