Seite 1 von 1

Abarbeiten einer Liste mittels Variablen?

Verfasst: Montag 19. November 2007, 15:47
von Aquerias
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

Verfasst: Montag 19. November 2007, 16:53
von Leonidas
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`?

Verfasst: Dienstag 20. November 2007, 08:02
von Aquerias
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.

Verfasst: Dienstag 20. November 2007, 15:54
von Leonidas
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.

Neue Tabelle in Access

Verfasst: Dienstag 20. November 2007, 15:59
von Aquerias
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

Re: Neue Tabelle in Access

Verfasst: Dienstag 20. November 2007, 17:51
von gerold
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
:-)

Verfasst: Mittwoch 21. November 2007, 08:45
von Aquerias
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.

Verfasst: Mittwoch 21. November 2007, 09:39
von 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)