stigi Geschrieben 27. April 2006 Geschrieben 27. April 2006 hi zusammen ich hab folgenden quellcode ausschnitt: import dbi import odbc conn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb') cur = conn.cursor() string1 = "Runddden" sql = "SELECT DISTINCT PA_INFO FROM Regel20 WHERE PA_INFO = string1" cur.execute(sql) rows = cur.fetchall() cur.close() conn.close() for row in rows: # row[0], fuer das erste Element in der SQL anweisung, row[1] fuer das zweite usw... print row[0] mein fehler liegt in der Zeile sql="SELECT.....string1" ich möchte das anstatt string1 nach dem Wert von string1 gesucht werden soll, also nach "Runddden" wie ist das anzupassen damit das so funktioniert ? thx im vorraus Zitieren
Amstelchen Geschrieben 27. April 2006 Geschrieben 27. April 2006 versuchs mal so: sql = "SELECT DISTINCT PA_INFO FROM Regel20 WHERE PA_INFO = " + string1 s'Amstel Zitieren
stigi Geschrieben 27. April 2006 Autor Geschrieben 27. April 2006 dann kommt dieser fehler: Traceback (most recent call last): File "Y:\.....\sqlstringtest.py", line 8, in ? cur.execute(sql) dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC Zitieren
Amstelchen Geschrieben 27. April 2006 Geschrieben 27. April 2006 ok, hab ich vermutet .. versuchs so. sql = "SELECT DISTINCT PA_INFO FROM Regel20 WHERE PA_INFO = '" + string1 + "'" ich seh allerdings die problematik, dass du abzufragende felder vom typ string in doppelhochkommata in die datenbank einschiessen musst. sql-standard ist zwar einfaches hochkomma, aber du greifst ja auf eine JET-db zu. s'Amstel Zitieren
stigi Geschrieben 27. April 2006 Autor Geschrieben 27. April 2006 hui hui danke funktioniert in nem anderen forum warte ich schon seit 2 tagen auf ne antwort und da kam immer nur sowas wie "lies das tutorial".... Zitieren
stigi Geschrieben 28. April 2006 Autor Geschrieben 28. April 2006 ok nächstes problem. vielleicht kurz die rahmengeschichte dazu. ich muss mit python eine access datenbank auf fehler untersuchen und diese fehler korrigieren. durchsucht wird die tabelle regel20 in der spalte PA_INFO. in der tabelle regel20 in der spalte PA_INFO_TEXTNR steht eine referenznummer hinter der sich in tabelle TEXTE der originaltext verbirgt. es soll also abgeglichen werden ob der text in regel20.pa_info mit dem original in texte.tex_ausgabe übereinstimmt. ich hab den code jetzt so: import dbi import odbc conn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb') cur = conn.cursor() sql = "SELECT DISTINCT PA_INFO, PA_INFO_TEXTNR, TEX_AUSGABE FROM Regel20, TEXTE WHERE REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE ='deu' and REGEL20.PA_INFO <> TEXTE.TEX_AUSGABE" #where PA_INFO like '%Runden%' cur.execute(sql) rows = cur.fetchall() cur.close() conn.close() for row in rows: # row[0], fuer das erste Element in der SQL anweisung, row[1] fuer das zweite usw... string1 = row[0] string2 = row[2] print string1 print row[1] print string2 print conn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb') cur = conn.cursor() cur.execute("UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + string1 + "' <> '" + string2 + "' and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu'") cur.close() conn.close() [/PHP] wenn in der tabelle regel20 jetzt alles korrekt ist läuft das script und bringt keine fehler. wenn ich jetzt aber einen wert verändere, und dieser dann automatisch korrigiert werden soll, was ja sinn und zweck der übung ist, kommt dieser fehler: [code]Traceback (most recent call last): File "Y:\....\spe4.py", line 23, in ? cur.execute("UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + strin g1 + "' <> '" + string2 + "' and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and T EXTE.TEX_SPRACHE='deu'") dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 2 Parameter wurden erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC[/code] Zitieren
Amstelchen Geschrieben 28. April 2006 Geschrieben 28. April 2006 cur.execute("UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + string1 + "' <> '" + string2 + "' and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and T EXTE.TEX_SPRACHE='deu'") dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 2 Parameter wurden erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC ich denke, das kann so nicht gehen. du vergleichst in deinem update-statement die variablen string1 und string2. eigentlich müsstest du ein feld mit einer variable vergleichen. kannst du mal zu debuggingzwecken das sql-statement in eine zwischenvariable stecken und cur.execute übergeben? s'Amstel Zitieren
stigi Geschrieben 28. April 2006 Autor Geschrieben 28. April 2006 meintest du das so ? sql2 = "UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + string1 + "' <> '" + string2 + "' and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu'" cur.execute(sql2)[/PHP] dabei kommt dann dieser fehler [code]Traceback (most recent call last): File "Y:\....\spe4.py", line 24, in ? cur.execute(sql2) dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 2 Parameter wurden erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC[/code] Zitieren
Amstelchen Geschrieben 28. April 2006 Geschrieben 28. April 2006 genau, aber ein echo bzw. print des sql2 wär halt jetzt aussagekräftig gewesen Zitieren
stigi Geschrieben 28. April 2006 Autor Geschrieben 28. April 2006 habs mal so versucht, jetzt auch mit print sql2 = "UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE REGEL20.PA_INFO <> TEXTE.TEX_AUSGABE and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu'" print sql2 cur.execute(sql2) [/PHP] kommt folgender fehler: [code] UPDATE REGEL20 SET PA_INFO = 'Runden' WHERE REGEL20.PA_INFO <> TEXTE.TEX_AUSGABE and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu' Traceback (most recent call last): File "Y:\Mitarbeiter\heilemannpa\pythonwin\spe5.py", line 25, in ? cur.execute(sql2) dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 3 Parameter wurden erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC[/code] Zitieren
Amstelchen Geschrieben 28. April 2006 Geschrieben 28. April 2006 kann mir jetzt nur noch vorstellen, dass die parameter des UPDATE-statement (welches ja in einem loop läuft darin die UPDATES schiesst) leer sind. was spuckt die debugausgabe aus? print string1 print row[1] print string2 print übrigens hast du weiters zwei connections (conn) definiert; eine im outer loop, eine im inner loop. du kannst das auch zusammenfassen, indem zu zwei cursor definierst: curForSelect = conn.cursor() curForUpdate = conn.cursor() curForSelect.execute(bla) curForUpdate.execute(foo) das spart ressourcen und ist einfacher wartbar s'Amstel Zitieren
stigi Geschrieben 2. Mai 2006 Autor Geschrieben 2. Mai 2006 danke hab das ganze jetzt nochmal umgebaut und jetzt siehts so aus: import dbi import odbc conn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb') curForSelect = conn.cursor() curForUpdate = conn.cursor() sql = "SELECT DISTINCT PA_INFO, PA_INFO_TEXTNR, TEX_AUSGABE FROM Regel20, TEXTE WHERE REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE ='deu' and REGEL20.PA_INFO <> TEXTE.TEX_AUSGABE" #where PA_INFO like '%Runden%' curForSelect.execute(sql) rows = curForSelect.fetchall() for row in rows: # row[0], fuer das erste Element in der SQL anweisung, row[1] fuer das zweite usw... string1 = row[0] string2 = row[2] print string1 print row[1] print string2 print sql2 = ("UPDATE REGEL20 SET PA_INFO = '%s' WHERE REGEL20.PA_INFO <> TEXTE.TEX_AUSGABE and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu'" % (string2)) #curForUpdate.execute(sql2) try: curForUpdate.execute(sql2) except: print sql2 curForSelect.close() curForUpdate.close() conn.close() [/PHP] dabei bekomm ich diese ausgabe: [code]Y:\Mitarbeiter\...\pythonwin>spe6 Runddden 63308 Runden UPDATE REGEL20 SET PA_INFO = 'Runden' WHERE REGEL20.PA_INFO <> TEXTE.TEX_AUSGABE and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu'[/code] Die erste Zeile mit Runddden ist der Fehler in meiner Tabelle der Korrigiert werden soll, also findet er ihn zumindest schonmal. Die zweite Zeile ist die dazugehörige Referenznummer, die stimmt auch und in der 3. Zeile steht auch schon das original welches über das falsche drübergeschrieben werden soll. darunter die SQL Query die leider so nich funktioniert Zitieren
stigi Geschrieben 2. Mai 2006 Autor Geschrieben 2. Mai 2006 habe die query mal im access ausgeführt und da funktioniert das query ohne Probleme. Access frägt mich nach 3 Werten: nach TEXTE.TEX_AUSGABE - da geb ich dann das original ein 'Runden' nach TEXTE.TEX_NUMMER - da geb ich die referenznummer 63308 ein und nach TEXTE.TEX_SPRACHE - da geb ich dann 'deu' ein damit wird genau dieses eine Feld welches ich korrigieren möchte korrekt verändert. Zitieren
stigi Geschrieben 2. Mai 2006 Autor Geschrieben 2. Mai 2006 wenn man ein paar klammern mitgibt und access auch sagt um welche tabelle es sicht handelt :hells: funktionierts auch sql2 = ("UPDATE REGEL20, TEXTE SET REGEL20.PA_INFO = '%s'WHERE ((REGEL20.PA_INFO<>TEXTE.TEX_AUSGABE And REGEL20.PA_INFO_TEXTNR=TEXTE.TEX_NUMMER And TEXTE.TEX_SPRACHE='deu'));" %(string3)) curForUpdate.execute(sql2) [/PHP] Problem gelöst, danke für die Hilfe :bimei Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.