Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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]

Geschrieben
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

Geschrieben

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]

Geschrieben

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]

Geschrieben

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

Geschrieben

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 :rolleyes:

Geschrieben

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.

Geschrieben

wenn man ein paar klammern mitgibt und access auch sagt um welche tabelle es sicht handelt :hells: funktionierts auch :D

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...