Access Datenbanken

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Donnerstag 27. April 2006, 10:09

stigi hat geschrieben:unglaublich, wo sind wir denn hier? wenn ich in der schule meinen lehrer nach was frag wie etwas funktioniert dann sagt der mir doch auch nicht ich soll das und das lesen, sondern erklärt es mir.
Wir sind hier in einem öffentlichen Forum, in dem User anderen Usern *kostenlos* Hilfe zur Selbsthilfe anbieten, während Dein Lehrer erstens dafür bezahlt wird und zweitens sich nicht wundern muss, dass Du nichts lernst, wenn er Dir die Lösungen vorkaut.

Dein Quellcode ist im Prinzip bekannt, Deine Fehlermeldung auch. Du bist offenbar in der Lage einen SQL-Request zu formulieren, diesen in einen String zu packen und diesen String an die Datenbank als Request zu senden. Das hast Du alles schon gepostet. Wenn Du tatsächlich auch Strings zusammensetzen kannst, dann verstehe ich nicht wo das Problem ist aus dem SQL-String und den beiden anderen Strings einen vollständigen Request-String zu machen.

@modelnine: Heut bin ich wohl dran. Sei grausam zu mir, falls nötig. :-) Ich bin gerne bereit mich an meinem eigenen Anspruch messen zu lassen.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Donnerstag 27. April 2006, 10:25

mir gehts nicht darum das mir jemand die lösung vorkaut, sondern das es mir jemand erklärt! in der zeit in der ich mich hier über solche antworten aufgeregt hab, hätt ich an meinen script schon weiterarbeiten können...
ich hab zig tutorials zu python und sql durchgemacht und ich weis einfach nicht was daran jetzt falsch ist. und dafür das ich vor 3 wochen noch nicht mal gewusst hab was python ist und noch nie was mit sql zu tun hatte hab ich mir das meiste doch recht schnell auch ohne hilfe selbst beigebracht.
udn jetzt wenn man hilfe braucht kommen solche sachen...
naja
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 27. April 2006, 12:08

stigi hat geschrieben:unglaublich, wo sind wir denn hier? wenn ich in der schule meinen lehrer nach was frag wie etwas funktioniert dann sagt der mir doch auch nicht ich soll das und das lesen, sondern erklärt es mir.
Hi!

Der Lehrer muss dir helfen --> wir nicht. Wir gehen davon aus, dass jemand, der in Python programmieren will, sich selber darum kümmert, zuerst einmal Python zu lernen und uns nicht jede Codezeile aus der Nase ziehen will.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Donnerstag 27. April 2006, 12:15

klar müsst ihr mir nicht helfen, aber anstatt mir irgendwelche sachen hinzuklatschen mit denen ich eh nix anfangen kann wärs meines erachtens sinnvoller gar nichts zu schreiben oder etwas das mich weiterbringt. ich warte jetzt seit heut morgen auf ne hilfreiche antwort, bin aber nur dabei rumzudisktutieren und mich zu rechtfertigen. was soll ich denn noch anderes machen als tutorials durcharbeiten und sachen zu lesen?... wenn ich nicht weiter komme dann frag ich eben danach wies weitergeht und hoffe auf ne qualifizierte antwort...oft genug hab ich jetzt meinen sourcecode hier reingestellt aber keiner hat dazu stellung genommen oder hat mir n tipp gegeben wo mein fehler liegt, anstattdessen bekomm ich belehrungen das man mir ja nicht helfen muss. wozu ist denn das forum denn dann da möcht ich gern mal wissen.

wenn euer auto kaputt is oder sonst irgendwas und ihr müsst es selbst wieder in schuss bringen und euch sagt jemand die nockenwelle ist defekt tausch sie aus, wisst ihr zwar was ihr machen sollt aber habt keine ahnung wie. und so gehts mir auch. da kannste nochsoviele anleitungen und kruscht durchlesen und man bekommts trotzdem nicht hin...
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Donnerstag 27. April 2006, 13:34

funktioniert jetzt. :!:
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 27. April 2006, 18:33

stigi hat geschrieben:unglaublich, wo sind wir denn hier? wenn ich in der schule meinen lehrer nach was frag wie etwas funktioniert dann sagt der mir doch auch nicht ich soll das und das lesen, sondern erklärt es mir.
Schon mal überlegt, das dein Lehrer dafür bezahlt wird? Es ist sein Job es dir zu erklären!

Wir sind hier alle nur Freiwillig ;)
stigi hat geschrieben:funktioniert jetzt. :!:
Und woran lag es denn jetzt?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 27. April 2006, 18:45

stigi hat geschrieben:klar müsst ihr mir nicht helfen, aber anstatt mir irgendwelche sachen hinzuklatschen mit denen ich eh nix anfangen kann wärs meines erachtens sinnvoller gar nichts zu schreiben oder etwas das mich weiterbringt.
Dann stell die fragen auch sinnvoll. Wenn du so eine Frage, stellts wie, wie kann ich meinen String ausführen, finde ich meine Antwort hilfreich, weil ich dein Problem nicht verstanden habe. Wenn du meinst, dass du String-Formattiertung verstanden hast, und SQL-Statements absetzen kannst, dann verstehe ich, ähnlich wie N317V nicht, wo genau nun dein problem liegt. Du setzt die Variablen in String ein. Was hätte man erklären müssen?

Ansonsten noch eine sehr gute Erklärung: Formatierung von SQL-Statements.
stigi hat geschrieben:ich warte jetzt seit heut morgen auf ne hilfreiche antwort, bin aber nur dabei rumzudisktutieren und mich zu rechtfertigen.
Eigentlich denke ich, dass du mit der Diskussion angefangen hast, über die Qualität der Antworten zu meckern. Wer meckert braucht sich nicht wundern wenn zurückgemeckert wird.
stigi hat geschrieben:was soll ich denn noch anderes machen als tutorials durcharbeiten und sachen zu lesen?
Passt schon, wunderbar. Nur steht das was zu fragst in vielen Tutorials und auch im Forum ist das Thema häufig diskutiert worden.
stigi hat geschrieben:... wenn ich nicht weiter komme dann frag ich eben danach wies weitergeht und hoffe auf ne qualifizierte antwort...
Ich hoffe meinerseits auf präzise Fragen und Verständniss, wenn meine Antworten nicht ganz das sind was du suchst.
stigi hat geschrieben:anstattdessen bekomm ich belehrungen das man mir ja nicht helfen muss. wozu ist denn das forum denn dann da möcht ich gern mal wissen.
Das Forum ist - ganz recht - dazu da, Leuten zu helfen. Wenn du fühlst, dass dir nicht geholfen wirst, dann tut es mir leid, denn die meisten User waren recht zufrieden. In diesem Fall kann ich dich auch auf die deutsche Mailingliste oder Newsgroup verweisen, vielleicht findest du dass du dort bessere Hilfe bekommst.
stigi hat geschrieben:wenn euer auto kaputt is oder sonst irgendwas und ihr müsst es selbst wieder in schuss bringen und euch sagt jemand die nockenwelle ist defekt tausch sie aus, wisst ihr zwar was ihr machen sollt aber habt keine ahnung wie. und so gehts mir auch. da kannste nochsoviele anleitungen und kruscht durchlesen und man bekommts trotzdem nicht hin...
Denn man fängt ja auch erst klein an. Rom wurde nicht an einem Tag erbaut (oder wie ging das Sprichwort nochmal?). Danach arbeitet man sich langsam vor. Wenn du weißt, wie man SQL-Statements absetzt und Strings verkettet, sollte das doch für dich kein Problem sein.

Da ich jetzt aber deine Frage etwas besser zu verstehen glaube, könnte ich sie inzwischen warscheinlich besser beantworten. Aber wie ich sehe hast du schon selbst eine Lösung gefunden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Freitag 28. April 2006, 07:15

war gestern einfach nicht mein tag, ging mir gestern alles gegen den strich...sorry

und mein fehler lag daran, dass ich nicht gewusst hab wie ich den python string in meine sql abfrage einbaue, was ich jetzt so gelöst hab:

Code: Alles auswählen

cur.execute("UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + string1 + "' <> '" + string2 + "'")
dadurch hat sich die sache mit den zu wenigen Parametern auch erledigt gehabt.
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Freitag 28. April 2006, 07:19

stigi hat geschrieben:....

Code: Alles auswählen

UPDATE REGEL20
  SET PA_INFO =string2 #wie mach ich das, damit der inhalt von string2 verwendet wird?
  WHERE string1 <> string2
....
nochmal zu meiner fragestellung. wie hätte ich es denn sonst formulieren sollen, damit es eine sinnvolle frage gewesen wäre?
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Freitag 28. April 2006, 07:43

stigi hat geschrieben:war gestern einfach nicht mein tag, ging mir gestern alles gegen den strich...sorry
Kann passieren. Von mir aus kein Thema.

Hätte man auch etwas eleganter so machen können:

Code: Alles auswählen

cur.execute("UPDATE REGEL20 SET PA_INFO = '%s' WHERE '%s' <> '%s'" % (string2, string1, string2))
stigi hat geschrieben: dadurch hat sich die sache mit den zu wenigen Parametern auch erledigt gehabt.
Genau das wurde Dir ja schon von Gerold prophezeit. Darum war das Problem aus unserer Sicht gelöst. Ist auch kein Thema, wenn Du mit etwas Simplen, wie dem zusammensetzten von Strings, Schwierigkeiten hast. Generell ist das aber eine Frage, die in allen Anfänger-Tutorials beantwortet wird. Wenn Du damit trotzdem Probleme hast, probier einfach rum, wie Du es meinst, poste den Code, damit wir sehen können, dass Du Dich auch selbst damit befasst hast und ich bin sicher, dass sich hier jederzeit jemand findet, der Dir hilft. Sicher hattest Du Deinen Code nochmal gepostet, aber keinen, der zur Frage passt. Das legt dann immer die Vermutung nahe, derjenige wolle eine Lösung vorgekaut bekommen. Der Lerneffekt ist für Dich auch viel größer. Oft ist es ja gerade bei Anfängern nur eine Kleinigkeit, die nicht stimmt. Ein vergessenes Komma oder so.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 28. April 2006, 07:53

stigi hat geschrieben:und mein fehler lag daran, dass ich nicht gewusst hab wie ich den python string in meine sql abfrage einbaue, was ich jetzt so gelöst hab:

Code: Alles auswählen

cur.execute("UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + string1 + "' <> '" + string2 + "'")
Wie schon mal erwähnt sollte man die SQL Escaping Funktion des Datenbank Moduls in jedem Fall nutzten!

siehe auch:

[wiki]Thema Sicherheit#Tipps[/wiki]
[wiki]Parametrisierte SQL Queries[/wiki]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Freitag 28. April 2006, 07:55

alles klar danke :)
mitlerweile hab ich zwar schonwieder das nächste problem :roll: aber ich versuchs erstmal selbst :lol:
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Freitag 28. April 2006, 13:04

ok, da ich mal wieder nich vorran komm, meine nächste frage :roll:

hier nochmal 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.

hier der code den ich bisher habe:

Code: Alles auswählen

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() 
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: Alles auswählen

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
ich weis, das etwas an meiner 2. SQL Abfrage mit dem Update was nicht stimmt, ich komm aber nicht drauf :(
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Freitag 28. April 2006, 13:25

Bau doch den Query-String erstmal nicht innerhalb des execute-Aufrufs zusammen und lass Dir nur mal den ausgeben. Erstens könntest Du so schneller sehen, wenn da ein Tippfehler drin ist (sieht nicht so aus, hab das grad getestet) und dann kannst Du Dir diesen String mal kopieren und direkt in Access testen. Möglicherweise bekommst Du dann eine aussagekräftigere Fehlermeldung als über ODBC. Am besten Du packst das ganze in eine try...except-Konstruktion und lässt Dir den Query-String im except-Fall ausgeben. (Toll formulieren tu ich heut auch wieder :? ) So in der Art:

Code: Alles auswählen

qry = "UPDATE REGEL20 SET PA_INFO = '" + string2 + "' WHERE '" + string1 + "' <> '" + string2 + "' and REGEL20.PA_INFO_TEXTNR = TEXTE.TEX_NUMMER and TEXTE.TEX_SPRACHE='deu'"
try:
    cur.execute(qry)
except:
    print qry
So bekommst Du genau die Query, die fehlschlägt.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Dienstag 2. Mai 2006, 06:46

sodele, das hab ich mal gemacht, habe mein script noch etwas umgebaut zwecks wartung und einfacher lesbarkeit

Code: Alles auswählen

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() 
folgende Ausgabe bekomm ich jetzt:

Code: Alles auswählen

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'
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 :roll:
[img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img] read between the lines for better smelling socks [img]http://img73.imageshack.us/img73/9951/stigismiley9cp.gif[/img]
Antworten