Abarbeiten einer Liste mittels Variablen?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Hallo,

ich habe zwei Listen in Python. In der einen Liste (LiName) stehen Nachnamen in der anderen Liste (LiAnzahl) die Anzahl der Nachnamen die an einem Ort/Stadt vorkommen.

Weiterhin habe ich eine Access Datenbank in der ebenfalls Nachnamen und deren Anzahl gespeichert sind. Nun möchte ich die alten Werte aus der DB mit den neuen Werten aus der Python Liste ersetzen.

Dafür habe ich mir folgenden Python-Code überlegt:

Code: Alles auswählen

try:
    import sys, string, os, arcgisscripting, pyodbc, random, win32com.client
    conn = win32com.client.Dispatch(r'ADODB.Connection')
    DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\\Test.mdb;'
    connect = conn.Open(DSN)

    LiN = LiName[0]
    print type(LiN)
    LiA = LiAnzahl[0]
    print type(LiA)

    def AccUp(connect):
 	sql = """
	UPDATE TabA INNER JOIN TabB ON TabA.ID = 
	TabB.StadtID SET TabB.Anzahl = ? WHERE (((TabB.Index)=12) AND ((TabA.Nachname)= ?))
        """
 	conn.Execute(sql, LiN, LiA)

    AccUp(connect)
    
   

except IOError:
	print "Fehler"
Sorry, die Formatierung im Quellcode stimmt nicht ganz. Bekomme ich nicht besser hin.

Folgende Fehlermeldung erscheint als Ergebnis:

Code: Alles auswählen

Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "AccessUpdate3.py", line 59, in ?
    AccUp(connect)
  File "AccessUpdate3.py", line 57, in AccUp
    conn.Execute(sql, LiN, LiA)
  File "<COMObject ADODB.Connection>", line 3, in Execute
  File "C:\Python24\lib\site-packages\win32com\client\dynamic.py", line 258, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, 'Microsoft JET Database Engine', 'F\xfcr mindestens einen erforderlichen Parameter wurde kein Wert angegeben.', None, 5000000, -2147217904), None)

Wenn ich allerdings die Variablen weg lasse und die Werte direkt in den SQL Befehl eintrage, funktioniert das Script.

Code: Alles auswählen


try:

	import sys, string, os, arcgisscripting, pyodbc, random, win32com.client
	conn = win32com.client.Dispatch(r'ADODB.Connection')
	DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\\Test.mdb;'
	connect = conn.Open(DSN)

	def AccUp(connect):
                sql = """
	 	UPDATE TabA INNER JOIN TabB ON TabA.ID = 
	 	TabB.StadtID SET TabB.Anzahl = 5
 		WHERE (((TabB.Index)=12) AND
 		((TabA.Nachname)= 'Mueller'))
 		"""
 		conn.Execute(sql)

	AccUp(connect)

except IOError:
	print "Fehler"
Kann mir jemand sagen welchen Fehler ich gemacht habe?
Wie bekomme ich es hin, dass anstatt den Werten Variablen stehen?


Momentan wird nur ein Wert aktualisiert. Später möchte ich das ganze noch mit einer Schleife erweitern damit alle Werte aktualisiert werden.

Im voraus schon mal Danke.

Aquerias
Zuletzt geändert von Aquerias am Dienstag 20. November 2007, 08:03, insgesamt 2-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was sagt denn nun `type(LiN)`?

Insgesammt sieht dein Code etwas seltsam aus. Eine eingebettete Funktion innerhalb eines try-except? Löschen von lokalen Variablen mittels `del`?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Hallo Leonidas,

mit type(LiN) kann ich mir denn Type der Variablen ausgeben lassen. Wäre im Fall LiN ein String und im Fall LiA Integer. Ich habe beim herumprobieren noch eine andere Fehlermeldung bekommen, irgendwas mit valueError, daher habe ich überprüft was genau an die Variablen übergeben wird.

try-except:

wenn ich ehrlich bin weis ich nicht so genau was try-except eigentlich macht.
Wenn ich das richtig verstanden habe soll man damit Fehler abfangen können, oder? Man kann das try-except auch weg lassen. Die Fehlermeldung bleibt trotzdem die gleiche.

Löschen von lokalen Variablen mittels `del`?:

habe ich rausgelöscht war noch übrig vom testen. Eigentlich sollen damit die zwei Listen gelöscht werden, nicht die Variablen.

Leider bin ich der Lösung zu meinem Problem nicht viel näher gekommen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Aquerias hat geschrieben:mit type(LiN) kann ich mir denn Type der Variablen ausgeben lassen. Wäre im Fall LiN ein String und im Fall LiA Integer. Ich habe beim herumprobieren noch eine andere Fehlermeldung bekommen, irgendwas mit valueError, daher habe ich überprüft was genau an die Variablen übergeben wird.
Versuch mal LiA zu einem String zu konvertieren, ob es dann funktioniert.
Aquerias hat geschrieben:try-except:

wenn ich ehrlich bin weis ich nicht so genau was try-except eigentlich macht.
Wenn ich das richtig verstanden habe soll man damit Fehler abfangen können, oder? Man kann das try-except auch weg lassen. Die Fehlermeldung bleibt trotzdem die gleiche.
Natürlich, weil das try-except nur IOErrors fängt, aber bei dir wird ein `com_error` geworfen, der wird davon nicht abgefangen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Tja ich habe schon ziemlich viel ausprobiert und das Problem trotzdem nicht gelöst. Jetzt versuche ich das ganze auf einem anderen Weg.

Weis jemand wie man mit Python in Access eine neue Tabelle erstellt und sie anschließend mit Werten aus einer Python Liste füllt?


Brauche ich dafür auch den cursor() und execute()?

MfG.

Aquerias
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Aquerias hat geschrieben:Weis jemand wie man mit Python in Access eine neue Tabelle erstellt und sie anschließend mit Werten aus einer Python Liste füllt?
Hallo Aquerias!

An Einfachsten mit pyODBC http://pyodbc.sourceforge.net/.

Hier ein Beispiel: http://www.python-forum.de/topic-12658.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Hallo,

vielen Dank für die Antworten.

also Leonidas ich habe deinen Rat befolgt und LiA in einen String umgewandelt. Leider bekam ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "AccessUpdate3.py", line 60, in ?
    AccUp(connect)
  File "AccessUpdate3.py", line 57, in AccUp
    cur = conn.cursor()
  File "C:\Python24\lib\site-packages\win32com\client\dynamic.py", line 491, in __getattr__
    raise pythoncom.com_error, details
com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, 'ADODB.Connection', 'Die Argumente sind vom falschen Typ, liegen au\xdferhalb des G\xfcltigkeitsbereiches oder sind miteinander unvereinbar.', 'C:\\WINDOWS\\HELP\\ADO270.CHM', 1240641, -2146825287), None)
Ich habe mal alle vier Möglichkeiten (str str, int int, int str, str int) ausprobiert. Allerdings habe ich entweder die obere oder die diese Fehlermeldung bekommen:

Code: Alles auswählen

Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "AccessUpdate3.py", line 44, in ?
    LiN = int(LiName[0])
ValueError: invalid literal for int(): IE
Tja momentan bin ich ziemlich ratlos.
BlackJack

Statt wild Konvertierungen durchzuführen kannst Du ja erst einmal herausfinden von was für einem Typ die Objekte sind.

Das hier an strategischen Stellen eingefügt ist bei der Fehlersuche oft hilfreich:

Code: Alles auswählen

print type(obj), repr(obj)
Antworten