2009-04-02 9 views
2

Je travaille sur un exe pour exporter SQL vers Access, nous ne voulons pas utiliser DTS car nous avons plusieurs clients exportant chacun des vues différentes et le temps système pour installer et maintenir les paquets DTS est trop . * Edit: Ce processus est automatisé pour de nombreux clients tous les soirs, de sorte que l'ensemble du processus doit être lancé et contrôlé au sein d'un curseur dans une procédure stockée. C'est parce que les données doivent être filtrées par projet pour l'exportation.MS Access interop - Data Import

J'ai essayé plusieurs façons d'obtenir des données sur SQL dans Access et a été le plus prometteur en utilisant l'accès Interop et l'exécution d'un

doCmd.TransferDatabase(Access.AcDataTransferType.acImport... 

J'ai frappé un problème où j'importe de vue, et le fonctionnement l'importation manuellement, il semble que la vue ne commence pas à retourner les données assez rapidement, donc l'accès affiche une boîte de dialogue MessageBox pour dire qu'il a expiré. Je pense que cela se passe aussi dans interop, mais parce qu'il est caché, la méthode ne revient jamais!

Y a-t-il un moyen pour moi d'empêcher ce message d'apparaître ou d'augmenter le délai d'expiration de la commande d'importation? Mon plan d'attaque actuel consiste à aplatir la vue dans une table, puis à l'importer à partir de cette table, puis à lâcher la table aplatie.

Heureux pour toutes les suggestions comment résoudre ce problème.

Edit:

Plus d'infos sur ce que je fais:

Nous avons plusieurs clients qui ont chacun un modèle de données standard. L'un des 'modules' est un exportateur d'accès (sproc). Il lit les vues à exporter à partir d'une table de paramètres puis les exporte. Les vues sont filtrées par projet et un fichier d'accès est créé pour chaque projet (chaque vue a un champ de projet)

Nous exécutons SQL 2005 et ne passons pas rapidement à SQL 2005, nous allons probablement passer à 2008 quelques mois.

On a alors une tâche d'exécution du module qui exécute le module configuré sur chaque base de données. De nombreux travaux d'importation/exportation/autres s'exécutent dans l'exécution de ce module, et l'exportateur d'accès doit pouvoir s'intégrer dans ce cadre. J'ai donc besoin d'un exportateur générique SQL -> Access qui peut être configuré via notre framework de paramètres. Actuellement, le sproc appelle un exe que j'ai écrit et mon exe ouvre un accès via interop, je sais que c'est mauvais pour un serveur MAIS l'exécution du module est écrite de sorte qu'un seul module s'exécute à la fois, donc la procédure ne jamais exécuter plus d'une instance à la fois.

Répondre

1

Je me suis installé sur une façon de le faire.

http://support.microsoft.com/kb/317114 décrit les étapes de base pour démarrer le processus d'accès.

J'ai fait de la classe Traiter une classe à la place d'une variable locale de la méthode ShellGetApp. De cette façon, quand j'appelle la fonction Quit pour l'accès, si elle ne se ferme pas pour une raison quelconque, je peux tuer le processus explicitement. J'ai ensuite utilisé une fonction de temporisation de méthode ici pour donner un délai à l'appel d'accès. S'il arrive à expiration, je peux tuer le processus d'accès aussi bien (délai d'attente pourrait être dû à une fenêtre de dialogue popping et je ne veux pas que le processus pendre à jamais. Je suis la méthode de délai d'attente ici.

Implement C# Generic Timeout

1

Avez-vous essayé d'utiliser VBA? Vous avez plus d'options la configuration des connexions, et je suis sûr que je l'ai utilisé un ajustement du délai d'attente dans ce contexte dans le passé.

De plus, je l'ai trouvé en général plus simple que d'interroger directement une vue (aussi longtemps que vous pouvez vous connecter avec un nolock, ou tolérer le temps qu'il faut pour transférer); cela pourrait être une bonne raison de créer la table temporaire intermédiaire.

Il pourrait également bénéficier de l'ouverture d'accès explicitement en mode mono-utilisateur pour ce genre de choses.

+0

Je viens d'éditer ma question, le processus doit être automatisé à partir d'une procédure stockée. Aussi VBA utilise l'accès interop, ce qui est très limité par rapport à outlook/excel il semble, donc tout ce que VBA fait, je devrais être capable de le faire via Com interop. Tableau intermédiaire que je peux exécuter avec nolock je suppose? –

+0

Si par interop vous voulez dire ce que je pense que vous voulez dire, qui est essentiellement DoCmd appelant Access Querydefs, macros et éléments de menu, alors Access VBA fait beaucoup plus - je n'ai jamais trouvé DoCmd utile. Une autre proposition d'Iffy utilise un curseur en SQL pour exécuter des instances d'Access. Est-ce que je comprends cela correctement? – dkretz

+0

Je vais vous aider à faire tout ce dont vous avez besoin, mais j'ai besoin de comprendre le contexte et les raisons des choses. – dkretz

1

Nous l'avons fait en utilisant ADO pour se connecter aux données source et de destination.Vous pouvez définir les valeurs de délai de connexion et de commande requises et lire/ajouter à chaque jeu d'enregistrements.

Pas particulièrement rapide, mais nous avons pu laisser courir la nuit

+0

Ah oui, je l'avais aussi fait fonctionner, mais certaines des tables que nous exportons retournent plus d'un million de lignes (dont une qui renvoie environ 6 mil), donc cette méthode est trop lente. –

0

Je suis heureux que vous ayez une solution qui fonctionne pour vous.Pour le bénéfice de ceux qui lisent ceci, je mentionnerai que SSIS aurait été une solution possible à ce problème.Notez que la différence entre SSIS et DTS est à peu près la nuit et

Il n'est pas difficile de paramétrer le processus d'exportation, de telle sorte que pour chaque client, vous pouvez exporter un ensemble de vues différent Vous pouvez boucler sur les lignes d'un fichier texte ayant Vous pouvez y afficher des noms ou utiliser une requête sur une base de données de configuration pour obtenir la liste des vues. Les autres paramètres peuvent provenir de la même base de données de configuration, par client et/ou par vue.

Si nécessaire, il est également possible d'effectuer un pré-traitement et un post-traitement par client, en exécutant un processus enfant, ou pacakge, si cela est configuré.