Bonjour,
j'essaye de remplacer un vieux programme VB6 en Python qui met à jour une table dans une vielles base MSACCESS 97 (cette base est utilisé dans un outil propriétaire dont nous n'avons pas les sources... nous sommes un peu bloqué avec cette très vieilles version...), le but est de supprimer tous les enregistrement d'une table CLIENT et de refaire des INSERT des nouvelles valeurs ainsi seuls les clients actifs sont présents.
je suis sous linux avec pyODBC et le driver MSACCESS MDB 0.7.1
J'arrive à me connecter sans erreur à la base Access97, voici un extrait de mon code :
Pour arriver à exécuter le SELECT (mis en commentaire, je n'ai pas besoin de lister la table), j'ai trouver en farfouillant sur le net qu'il fallait ajouter : cnxMSAccess.setdecoding(pyodbc.SQL_CHAR, encoding='iso-8859-1') cnxMSAccess.setdecoding(pyodbc.SQL_WCHAR, encoding='iso-8859-1') et cnxMSAccess.setencoding(encoding='iso-8859-1') et effectivement ça a fonctionné.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 # -*- coding: utf-8 -*- # Python 3.7 2020-02-28 import os import datetime import time import sys import pyodbc ... def MajTableMSAccess(cheminMdb): try: cnxMSAccess = pyodbc.connect('Driver={MDB 0.7.1};DBQ=' + cheminMdb + ';Uid=Admin;Pwd=;',ansi=True) except Exception as inst: print("{0} Error : {1} ".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),sys.exc_info()[0])) print(type(inst)) print(inst.args) else: cnxMSAccess.setdecoding(pyodbc.SQL_CHAR, encoding='iso-8859-1') cnxMSAccess.setdecoding(pyodbc.SQL_WCHAR, encoding='iso-8859-1') cnxMSAccess.setencoding(encoding='iso-8859-1') curR = cnxMSAccess.cursor() print("{0} Connexion MSAccess {1} OK".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),cheminMdb)) #curR.execute('Select * from CLIENT') #rows = curR.fetchall() #print("{0} requete MSAccess {1} OK".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),'Select * from CLIENT_GPAO')) try: #curR.execute('DELETE FROM CLIENT') curR.execute('TRUNCATE TABLE CLIENT') print("{0} Table {1} -> CLIENT => Delete OK...".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),cheminMdb)) except Exception as inst: print("{0} Error : {1} ".format(datetime.datetime.today().strftime("%Y-%m-%d %H:%M"),sys.exc_info()[0])) print(type(inst)) print(inst.args) finally: curR.close() cnxMSAccess.close() ...
j'ai donc mis mes lignes du SELECT en commentaire en me disant "super je peux me connecter et lancer une requête SELECT tout est OK" ... Mais non ...
dès que j'ai mis la requête curR.execute('DELETE FROM CLIENT') puis curR.execute('TRUNCATE TABLE CLIENT') (j'ai essayé avec ou sans ";" en fin de requête ... toujours la même anomalie :
j'ai trouvé plusieurs cas avec la même erreur sur des SELECT avec des erreurs de syntaxe dans la commande SQL, mais là je ne vois pas ce qui gêne dans 'DELETE FROM CLIENT' ou 'TRUNCATE TABLE CLIENT'.syntax error near DELETE
Got no result for 'DELETE FROM CLIENT' command
[08001] Couldn't parse SQL\n (1) (SQLExecDirectW)
ou
syntax error near TRUNCATE
Got no result for 'TRUNCATE TABLE CLIENT' command
[08001] Couldn't parse SQL\n (1) (SQLExecDirectW)
je ne sais pas si le problème n'est pas comme pour le SELECT un pb de transcodage entre l'Unicode de Python et le latin-1 de MSACCESS, mais je ne sais pas quoi mettre comme option, je pensais que les 3 commandes setencoding corrigeaient tous les pb de tranco en entrée comme en sortie ...
Si quelqu'un a une idée pour me dépatouiller... et je n'ai pas encore testé les INSERT ...
Merci d'avance.
Cordialement,
Alain
Partager