2009-05-11 7 views
0

Avis de non-responsabilité: Je sais que c'est une mauvaise façon de faire les choses. C'est la seule option que nous avons avec notre client.Lire à partir d'Excel en utilisant OleDb dans un service Windows?

Problème:

Nous avons besoin de lire les données à partir d'un fichier Excel chaque quantité x de temps. Les données changent constamment via un plug-in Excel tiers. L'environnement de l'application est Windows XP, SP1 et .Net 2.0. Aucune mise à niveau du système d'exploitation vers SP2/3 ou mise à niveau du .Net Framework. Encore une fois, tout cela est par les paramètres du client.

Voici le code actuel, nous avons:

 
String sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Settings.ReutersFilePath + ";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\""; 
using (OleDbConnection objConn = new OleDbConnection(sConnectionString)) 
{ 
    try 
    { 
     objConn.Open(); 
     _dataSet = new DataSet(); 
     OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + ConfigurationManager.AppSettings["Excel.WorksheetName"] + "$]", objConn); 
     OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(); 
     objAdapter1.SelectCommand = objCmdSelect; 
     objAdapter1.Fill(_dataSet); 
     _dataTable = _dataSet.Tables[0]; 
     objConn.Close(); 

     // Persists new data to a database. 
     UpdateSQL(); 
    } 
    catch (Exception ex) { } 
    finally 
    { 
     _isCurrentlyProcessing = false; 
     if (objConn != null && (objConn.State != ConnectionState.Broken || objConn.State != ConnectionState.Closed)) 
     { 
      objConn.Close(); 
     } 
    } 
} 

Ce code fonctionne lors de l'exécution de la console ou une forme Windows, mais quand nous courons d'un service Windows, il ne peut pas accéder au fichier Excel. Existe-t-il une limite dans XP w/SP1 qui ne permet pas l'interaction avec les applications de bureau comme dans Vista? Cela peut-il être fait à partir d'un service? La fiabilité de l'exécution à partir d'un service est très nécessaire du client.

Edit:

Le service est en cours d'exécution en tant que LocalSystem.

Edit # 2:

L'erreur que je reçois lors de l'exécution d'un service est: Le moteur de base de données Microsoft Jet ne peut pas ouvrir le fichier « ». Il est déjà ouvert exclusivement par un autre utilisateur, ou vous avez besoin d'une autorisation pour afficher ses données.

Le fichier Excel est ouvert sur le bureau, mais il doit être ouvert pour recevoir des mises à jour de l'application tierce.

Répondre

3

En plus de la réponse de @ sontek.

[uniquement applicable Si vous êtes les propriétaires/développeurs de la feuille de calcul en question ...]

Il est peut-être plus facile de travailler avec un modèle "Data Push" plutôt qu'avec un modèle "Data Pull". C'est généralement un modèle de programmation plus simple pour pousser les données via une macro Excel directement dans votre magasin de données, en fonction d'un événement de votre plug-in. C'est souvent un scénario beaucoup mieux qu'un service d'interrogation sur une minuterie.

+0

Je n'ai jamais dérangé avec aucun des trucs de macro Excel. être la meilleure option Je suppose que la macro d'Excel peut détecter des changements aux cellules et ensuite déclencher la logique? – Gromer

+0

Oui, certainement .Les événements sont déclenchés à plusieurs niveaux, les événements de cellules seraient manipulés au niveau de la feuille (d'autres niveaux sont Application , Workbook et Chart) et vous obtenez les cellules qui ont changé passé au gestionnaire en tant que plage –

+0

Un exemple de code ici http://support.microsoft.com/kb/302815 –

1

De quel utilisateur le service est-il exécuté? Assurez-vous que l'utilisateur a accès au fichier spécifique.

+0

Le service s'exécute en tant que LocalSystem. Où dois-je vérifier dans XP pour lesdites autorisations. – Gromer

+1

Autorisations n'est pas le problème maintenant que vous avez posté votre erreur :) – sontek

1

Il semble très probable que ce soit un problème d'autorisations. Les services Windows s'exécutent sous un compte d'utilisateur différent des applications de bureau.

De plus, vous mentionnez que vous exécutez cette méthode tous les x fois. Assurez-vous que vous utilisez les bons minuteurs. http://www.aspfree.com/c/a/C-Sharp/Timer-Objects-in-Windows-Services-with-C-sharp-dot-NET/

Et vous devriez être en mesure d'attacher un débogueur au service en utilisant "Attach to Process" et en sélectionnant votre processus hôte. Cela pourrait vous donner plus d'informations sur votre problème. http://msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx

+0

Ne pas avoir n'importe quel deveneur sur la machine, nous pouvons tester cela sur, donc attacher un débogueur ne fonctionnera pas. Je n'ai pas encore eu de chance d'attacher à distance un débogueur. Comme pour la minuterie, nous utilisons un System.Threading.Timer. Je pourrais essayer de connecter le service en tant qu'utilisateur pour voir ce qui se passe. – Gromer

0

Vous pouvez essayer d'en faire un classeur partagé (Outils> Partager le classeur). Cela permet à plusieurs utilisateurs de modifier le même classeur simultanément. Je ne suis pas sûr si cela fonctionnerait pour vous car certaines fonctionnalités du classeur sont verrouillées lorsqu'il est partagé

+0

Quand il est partagé, le code C# ne peut pas obtenir les dernières données du fichier Excel :(Il obtient seulement les dernières données enregistrées – Gromer

2

Excel ne vous permet pas d'ouvrir un fichier simultanément. Vous devez le créer comme un classeur partagé ou faire une copie du fichier et travailler hors de la copie.

Il existe également une API Excel complète (Microsoft.Office.Interop.Excel) que vous pouvez utiliser, ce qui vous permet de vous connecter au classeur/classeur Excel actuellement ouvert.

1

peut ouvrir un fichier même si Excel a actuellement le fichier ouvert et qu'il est bien adapté à l'utilisation à partir d'un service Windows. Toutefois, le fichier sur le disque ne reflétera pas les modifications qui n'ont pas été enregistrées par Excel et SpreadsheetGear ne pourra pas ouvrir un classeur alors qu'Excel est en cours d'enregistrement. Le service devra donc prendre en charge Compte.

Clause de non-responsabilité: Je possède SpreadsheetGear LLC

Questions connexes