[Edit 2: Weitere Informationen und das Debuggen in Antwort unten ...]Problem Daten in MS Access-Datenbank einfügen mit ADO über Python
Ich bin ein Python-Skript zu schreiben MS Access-Datenbanken in eine Reihe von Text zu exportieren Dateien, um eine aussagekräftigere Versionskontrolle zu ermöglichen (Ich weiß - warum Access? Warum verwende ich keine bestehenden Lösungen? Sagen wir einfach, die Einschränkungen sind nicht technischer Natur).
Ich habe erfolgreich den vollständigen Inhalt und die Struktur der Datenbank mit ADO und ADOX über die Comtypes-Bibliothek exportiert, aber ich bekomme ein Problem, die Daten erneut zu importieren.
ich den Export der Inhalt jeder Tabelle in eine Textdatei mit einer Liste in jeder Zeile, etwa so:
[-9, u'No reply']
[1, u'My home is as clean and comfortable as I want']
[2, u'My home could be more clean or comfortable than it is']
[3, u'My home is not at all clean or comfortable']
Und die folgende Funktion, die die Datei zu importieren:
import os
import sys
import datetime
import comtypes.client as client
from ADOconsts import *
from access_consts import *
class Db:
def create_table_contents(self, verbosity = 0):
conn = client.CreateObject("ADODB.Connection")
rs = client.CreateObject("ADODB.Recordset")
conn.ConnectionString = self.new_con_string
conn.Open()
for fname in os.listdir(self.file_path):
if fname.startswith("Table_"):
tname = fname[6:-4]
if verbosity > 0:
print "Filling table %s." % tname
conn.Execute("DELETE * FROM [%s];" % tname)
rs.Open("SELECT * FROM [%s];" % tname, conn,
adOpenDynamic, adLockOptimistic)
f = open(self.file_path + os.path.sep + fname, "r")
data = f.readline()
print repr(data)
while data != '':
data = eval(data.strip())
print data[0]
print rs.Fields.Count
rs.AddNew()
for i in range(rs.Fields.Count):
if verbosity > 1:
print "Into field %s (type %s) insert value %s." % (
rs.Fields[i].Name, str(rs.Fields[i].Type),
data[i])
rs.Fields[i].Value = data[i]
data = f.readline()
print repr(data)
rs.Update()
rs.Close()
conn.Close()
Alles funktioniert einwandfrei, außer dass numerische Werte (double und int) als Nullen eingefügt werden. Irgendwelche Ideen, ob das Problem mit meinem Code, eval, comtypes oder ADO ist?
Edit: Ich habe das Problem mit dem Einfügen von Zahlen behoben - Casting sie als Strings (!) Scheint das Problem für beide Doppel-und Integer-Felder zu lösen.
Allerdings habe ich jetzt ein anderes Problem, das zuvor durch das Obige verdeckt wurde: das erste Feld in jeder Zeile wird auf 0 gesetzt, unabhängig vom Datentyp ... Irgendwelche Ideen?
Und der Rest der Lösung bestand darin, "rs.Fields [i] .Value = data [i]" in "rs.Fields [i] .Value = str (data [i])" zu ändern? – BIBD
Nein, nein. Sollte explizit gesagt haben: das Hinzufügen der dynamischen = True löste sowohl das ursprüngliche Problem mit numerischen Werten als auch das Folgeproblem mit variablen Ergebnissen. Sobald es an Ort und Stelle war, funktionierte rs.Fields [i] .Value = data [i] gut und tatsächlich warf das Umwandeln der Zahlen als Strings einen Typ-Mismatch-Fehler. – mavnn
Kewl, ich war nicht klar auf die Antwort. An dieser Stelle würde ich sagen, markieren Sie Ihre eigene Antwort als Akzeptiert. – BIBD