J'essaie d'écrire une requête dans MS Access pour ouvrir une connexion à un serveur SQL local, puis d'importer des tables de sélection dans MS Access.
Mon code s'exécute jusqu'à ce que le Erreur de temps d'exécution '-2471765 (80040E37)' [pilote Microsoft] [ODBC SQL Server] [SQL Server] Nom d'objet non valide 'DBO_SQLSERVERTABLE'. P>
blockQuote> J'ai besoin d'importer des tables supplémentaires afin que j'ai besoin d'un code qui fonctionnera lorsque je modifie des noms de table. P> cn.execute code> déclaration. Je reçois p>
Cn.Execute "INSERT INTO Test(VisitID, Provider) SELECT VisitID, Provider FROM dbo.SQLServerTable;"
4 Réponses :
Vous ne voulez pas le préfixe de la table dans votre sélection de la table SQL. Il suffit de faire SELECT * à partir de DBO_SQLSERVERTABLE; CODE> Meilleure pratique, cependant, ne veut pas utiliser
SELECT * CODE> mais spécifie plutôt les colonnes au cas où les schémas de table ne changent jamais. P>
Et ce que @zekigumus a dit à propos du nom de la table d'accès.
J'ai déjà la même structure de table dans ma table d'accès? Semblerait que je dois toujours épeler tous les champs?
Ce n'est pas une exigence, juste quelque chose à conscience de. Parfois, les noms de colonne sont commutés et en utilisant SELECT * CODE> finissent par faire une erreur ou, même pire, abandonnant les choses dans les mauvaises colonnes.
Il y a quelques suggestions pour ce problème particulier P>
Toutes ces approches vont bien fonctionner. Je suggère des tables liées pour que vous ne dupliquiez pas de données, mais c'est une cinsserie de vous depuis que je ne savais pas les exigences du projet. P>
DBO_SQLSERververTable est un nom de table d'accès, pas le nom de la table SQL Server. Parce que vous avez déjà créé la table liée DBO_SQLSERververTable, vous pouvez utiliser le code VBA suivant.
Currentproject.connection.execute "INSERT INTO MyAccessTable(fld1, fld2, fld3) SELECT fld1, fld2,fld3 FROM dbo_SQLServerTable"
Merci pour la réponse! Donc, toutes les lignes de code précédentes peuvent être supprimées si la seule instance de SQL Server que j'ai couru?
Oui. C'est correct. La table liée vous donne l'accès à la table SQL Server. Vous pouvez utiliser mon code ou créer une requête d'append, appelée requête d'action dans l'accès.
Le point ici est si le tableau est déjà lié, vous pouvez simplement exécuter la requête en annexe. Cependant, votre question a suggéré que la table SQL en question n'était pas liée. Vous pouvez donc soit dans le code Créer une table liée à la table SQL Server, soit vous pouvez utiliser la requête PT. Une fois la définition de la table (ou de la requête PT) liée (ou de la requête PT), vous exécutez la requête simple append simple. Si les tables SQL en question que vous souhaitez utiliser pour l'annexe des tables locales existent déjà, vous pouvez utiliser CurrentProject.Conneciton et ne pas vous embêter avec l'approche PT.
moins du code de code, je peux penser, c'est utiliser une requête transparente.
Configurez une requête PT sur la base de données du serveur en question. P>
Alors votre code pour créer une nouvelle table dans L'accès ressemblerait à: p> Le susceptible de bien sûr vous permet de configurer la connexion à SQL Server (une base de données) lorsque vous avez créé la requête PT. L'approche ci-dessus est agréable puisque vous ne plaisante pas avec des chaînes de connexion dans le code. P> Cependant, étant donné que vous avez besoin (vouloir) de spécifier la base de données (et le serveur probable), alors ci-dessus devient ceci: ce qui précède utilise une fonction "pratique" pour créer votre chaîne de connexion. P> Cette fonction est la suivante: p> CurrentDb.Execute "INSERT INTO " & strLocalTable & " SELECT * FROM qryPassR"
Hey Albert, j'ai essayé d'exécuter le code mais il dit que votre fonction "pratique" Sytanx était invalide. Je suis sûr que j'essaie de l'utiliser mal. Pour référence, je tente de mettre le VB derrière un bouton afin de permettre à l'utilisateur final de «rafraîchir» les données en cliquant sur, effacer la base de données, ce qui leur permet d'importer, puis de leur permettre de travailler avec de nouvelles données. Ce code ne fonctionne pas dans un bouton privé sous-ci? De plus, pouvez-vous fournir plus de référence à une transaction par la requête? Je n'ai jamais travaillé avec ceux-ci!
Bien sûr, mais vous avez besoin de cette fonction dbcon () placée dans un module de code standard (pas un module de formulaires). Je suppose que vous pouviez placer la 2e Fonction DBCON () à l'intérieur du module de code de formulaires, mais cette fonction est susceptible d'être utilisée "partout sur la place" dans votre code.
Pour créer une requête PT, Fire Up Access Requête Builder. Créez une nouvelle requête, puis dans le ruban, appuyez sur l'icône Pass-bien. À ce stade, vous pouvez simplement enregistrer la requête, car nous définissons le SQL directement dans la requête. Si vous n'avez pas eu l'exigence de "souvent" changer la base de données source, vous ne définirez pas la connexion de la requête PT dans votre code (comme nous le faisons). La connexion pour la requête PT sera définie comme la même que ce que vous avez pour les tables liées. Je suppose que vous avez des tables liées à SQL Server - vous pouvez donc inclure les requêtes PT de votre code de re-Link.
Pour configurer la connexion pour la requête PT, appuyez sur la touche feuille de protérieure dans le ruban. Ensuite, dans la feuille, choisissez ODBC Connect Str. Frapper la [...] déposera le même gestionnaire de connexion ODBC que vous utilisez pour toutes les tables liées. Toutefois, comme indiqué, votre cas est "rare" en ce que votre source pour la requête PT va souvent changer - ce n'est pas un cas d'utilisation normal pour la plupart des applications.
Albert, merci beaucoup pour vous aider. J'ai marqué cette réponse correcte. En fin de compte, j'ai déterminé que je devrais seulement vous connecter à un serveur afin que j'ai pu définir la connexion dans la touche Pass via la requête. Fonctionne comme un charme! La question finale, je suppose que la requête PT crée une connexion temporaire, oui? Il semble que PT comme un nom implique que ... merci encore beaucoup !!
Eh bien, des tables liées, PT Quères utilisent souvent un type de mise en cache de connexion. Et pour les tables liées ou les indemnités PT, si vous exécutez une connexion unique à partir de l'accès, toutes les tableaux et les points de vue liés et PT n'ont donc pas besoin d'inclure l'utilisateur / mot de passe de la chaîne de connexion. La complexité de la mise en cache est donc un sujet assez large et large. La requête PT actuelle, ou dire des table (s) liées (s) lorsqu'elle est fermée, libérez la connexion, mais elles sont potaculées de toute façon à ma connaissance. Le mot "temporaire" est donc difficile à qualifier, car les informations de connexion sont regroupées et réutilisées par accès.
Le nom de la table est-il vraiment "dbo_sqlserververtable"? il devrait probablement être "dbo.sqlserverttable". C'est la première erreur. Vous obtiendrez probablement un autre message d'erreur sur "Table d'accès". Placez la table dans le support comme [table d'accès].
En outre, si vous ne fournissez pas les colonnes que vous souhaitez insérer dans l'instruction INSERT qui est moyenne [table d'accès] et les tables SQLServertables ont la même structure de table. Est-ce correct?
Les tableaux cible (s) existent-ils dans l'accès ou souhaitez-vous avoir accès à une table de la SQL?
J'ai d'abord importé cette table manuellement de SQL Server car je ne voulais pas avoir à répertorier tous les champs de mon code VBA. J'ai supposé que je pouvais juste courir "Select *" en conséquence, mais peut-être que ce n'est pas le cas
Bien, vous pouvez. Le problème de base reste toujours, cherchez-vous à créer une nouvelle table ou à ajouter à une table existante?
Ajouter dans un existant
Ah ok. Mon message ci-dessous suppose que vous créez des tables dans l'accès. Changement simple Le code - Je mettrai à jour ma réponse pour inclure les données aux tables d'accès existantes. (Utilisez simplement une requête d'append à la place de faire des requêtes de table que mon exemple actuellement a actuellement).