2016-11-07 2 views
1

Je joue avec win32com.client pour python pour essayer d'écrire/insérer une ligne dans une table MS Access. J'ai trouvé un exemple de connexion et d'interrogation d'une table Access here. En fait, leur code légèrement modifié pour mon propre usage est:Ecrire dans la table MS Access, python win32com

import win32com.client 

connection = win32com.client.Dispatch(r'ADODB.Connection') 
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=c:\\testdb.mdb;' 
connection.Open(DSN) 
recordset = win32com.client.Dispatch(r'ADODB.Recordset') 
recordset.Open('SELECT * FROM Table1', connection, 1, 3) 
fields_dict = {} 
for x in range(recordset.Fields.Count): 
    fields_dict[x] = recordset.Fields.Item(x).Name 
    print fields_dict[x], recordset.Fields.Item(x).Value 

Alors cela me dit comment exécuter une instruction select sur la table d'accès. J'aimerais pouvoir écrire des lignes et des données sur la table. Lorsque j'utilise win32com pour les produits MS Office, j'ai tendance à plonger dans le MSDN pages et essayer d'interpréter le code VBA pour le code python, mais celui-ci m'a un peu menotté. Coupler cela avec des exemples trouvés sur Internet après de longues recherches m'a fait me demander si cela est possible ou non? J'espère que quelqu'un là-bas a joué avec cela avant et a une suggestion.

+1

Si vous pouvez exécuter une instruction 'select' avec win32com alors vous pouvez exécuter une instruction trop' de INSERT', bien spécifier les paramètres pour un 'ADODB.Command' objet sera un peu bavarde . Une approche plus courante consiste à utiliser pyodbc (ou peut-être pypyodbc) avec le pilote Access ODBC pour effectuer des opérations CRUD aussi simples, et sauver win32com pour effectuer des manipulations de bas niveau de la base de données utilisant Access DAO, par exemple, pour apporter des changements structurels. ne gère pas. –

+0

Merci Gord. Je voudrais rester avec win32com si je peux. J'ai jeté un œil à pyodbc dans mes voyages à travers mes recherches. C'est là que je vais aller si cela ne marche pas. – Mike

+1

Pour ajouter le commentaire @ GordThompson, MS Access est à la fois une base de données principale et une application graphique .exe. Lorsque vous souhaitez exécuter des instructions SQL comme l'insertion de lignes, considérez les connexions db api (par exemple, odbc) comme avec d'autres RDMS: SQLite, SQL Server, MySQL, etc. Lorsque vous devez ajuster forms/reports/macros/modules, exécutez Access comme 'DoCmd. *', ou d'autres couches d'application, utilisez l'interface COM. Rappelez-vous aussi VBA est un composant externe à Access.exe et COM-connecte comme vous êtes avec Python! – Parfait

Répondre

2

Comme je l'ai mentionné dans mon commentaire à la question, en utilisant pyodbc (ou pypyodbc) et le pilote ODBC Access est une façon plus commune de faire des opérations de CRUD, mais si vous vraiment voulez utiliser win32com et OLEDB alors vous pourriez faire une UPDATE comme ceci:

import win32com.client 

# ADODB constants 
adVarWChar = 202 
adInteger = 3 
adParamInput = 1 

connection = win32com.client.Dispatch(r'ADODB.Connection') 
DSN = (
    r'PROVIDER=Microsoft.Jet.OLEDB.4.0;' 
    r'DATA SOURCE=C:\Users\Public\mdbTest.mdb;' 
    ) 
connection.Open(DSN) 
cmd = win32com.client.Dispatch(r'ADODB.Command') 
cmd.ActiveConnection = connection 
cmd.CommandText = "UPDATE Donors SET LastName = ? WHERE ID = ?" 
cmd.Parameters.Append(cmd.CreateParameter("?", adVarWChar, adParamInput, 255)) 
cmd.Parameters.Append(cmd.CreateParameter("?", adInteger, adParamInput)) 
cmd.Parameters(0).Value = "Thompson" 
cmd.Parameters(1).Value = 10 
cmd.Execute() 
connection.Close() 
+0

Merci Gord. J'ai fait quelques modifications pour mon usage personnel et j'ai fait en sorte que votre script fonctionne pour moi. Je regarde aussi un peu plus près de pyodbc. Vous avez été une bonne aide. À votre santé. – Mike