Seite 1 von 4

Access Datenbanken

Verfasst: Dienstag 18. April 2006, 09:34
von stigi
hab mich hier im forum umgeschaut und dieses hier gefunden:

Code: Alles auswählen

import dbi 
import odbc 

myconn = odbc.odbc('DB_Modell_mit_Daten.mdb') 
mycursor = myconn.cursor() 
mycursor.execute('SELECT * FROM T_DATEN') 
mydata = mycursor.fetchall() 
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
Kann mir einer erklären was dieses codesnippet genau macht ? Am besten zeile für zeile, damit ich es auf meine mdb anpassen kann

thx

Re: Access Datenbanken

Verfasst: Dienstag 18. April 2006, 10:45
von gerold
Hi stigi!

Hier ein Link zur allgemeinen Datenbankschnittstelle von Python: http://www.python.org/dev/peps/pep-0249/

Mehr Zeit habe ich jetzt nicht. ;-)

mfg
Gerold
:-)

Verfasst: Dienstag 18. April 2006, 11:49
von stigi
danke erstmal für den link :) ich werd mich da mal durchkämpfen! :D

wär cool wenn trotzdem noch jemand bei gelegenheit meine frage genau beantworten könnte :lol:

danköö

Verfasst: Dienstag 18. April 2006, 12:12
von icepacker
Hi
Ich muss zwar gestehen, dass ich keine Ahnung von Python in Zusammenhang
mit Datenbanken habe, aber ich probiere es trotzdem mal...
Ansonsten einfach ignorieren :wink:

Code: Alles auswählen

myconn = odbc.odbc('DB_Modell_mit_Daten.mdb') # Verbindung zur Datenbank wird hergestellt
mycursor = myconn.cursor()
mycursor.execute('SELECT * FROM T_DATEN') # Es wird eine Query ausgeführt: Alle Daten von der Tabelle "T_DATEN" holen
mydata = mycursor.fetchall() # Alle Zeilen aus dem Resource-Objekt holen
print mydata[0] # Erste Zeile ausgeben
mycursor.close() 
myconn.close() # Verbindung schliessen
print mydata[1] # Zweite Zeile ausgeben?
lg icepacker

Verfasst: Dienstag 18. April 2006, 12:16
von stigi
kann ich das 'DB_Modell_mit_Daten.mdb' dann einfach durch 'C:\Temp\database.mdb' ersetzen ?
geht nämlich leider nich so :cry:

wie muss ich denn meine datei dann ansprechen?

Verfasst: Dienstag 18. April 2006, 12:33
von icepacker
Ist mdb eine Datenbank?

Wenn nein, probier doch mal connect(...) statt der ersten Zeile.
Die Parameter sind dann aber wieder Datenbank abhängig. Man müsste diese
also Wissen...

edit: Sehe gerade das der Titel Acces Datenbank heißt :oops: , also wie gesagt,
das Verbinden scheint Datenbank abhänig zu sein.
Guck doch dann mal am besten im im Manual von Access.

Verfasst: Dienstag 18. April 2006, 12:49
von gerold
Hier habe ich noch einen Link:

http://www.python-forum.de/post-15146.html#15146

mfg
Gerold
:-)

Verfasst: Dienstag 18. April 2006, 13:00
von stigi
habs jetzt so versucht

Code: Alles auswählen


import dbi 
import odbc 

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\temp\T100_V46.mdb') 
mycursor = myconn.cursor() 
mycursor.execute('SELECT * FROM REGEL20') 
mydata = mycursor.fetchall() 
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
dabei entsteht folgender fehler

Traceback (most recent call last):
File "Y:\Mitarbeiter\muster\pythonwin\spe1.py", line 5, in ?
myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:
\temp\T100_V46.mdb')
dbi.operation-error: [Microsoft][ODBC Microsoft Access Driver] Kein zulõssiger D
ateiname. in LOGIN

Y:\Mitarbeiter\muster\pythonwin>

Verfasst: Dienstag 18. April 2006, 13:13
von stigi
ok ich habs anders hinbekommen und zwar

so

Code: Alles auswählen

import win32com.client 

conn = win32com.client.Dispatch(r'ADODB.Connection') 
#DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/DB.mde; 
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\Temp\T100_V46.mdb;' 
conn.Open(DSN) 

rs = win32com.client.Dispatch(r'ADODB.Recordset') 
rs.Open('SELECT * FROM REGEL20', conn, 1, 3) 

flds_dict = {} 
for x in range(rs.Fields.Count): 
    flds_dict[x] = rs.Fields.Item(x).Name   # Die Spaltenueberchriften werden ausgelesen 
    print flds_dict[x] 
    #print rs.Fields.Item(x).Type             # Feldtyp 202 ist ein Textfeld. 3 inst ein Integerfeld 
    #print rs.Fields.Item(x).DefinedSize     # Groesse des Spaltenfeldes. in Access hatten wir fuer Text 50 
    print '','','', 
    x = rs.Fields.Item(x).Value               # Feldwerte 
    print x 
jetzt würde mich aber interessieren was genau die beiden werte in dieser zeile hier zu bedeuten haben

rs.Open('SELECT * FROM REGEL20', conn, 1, 3)

für was stehen die 1 und die 3 ?

und gleich noch ne frage hinterher:
wie muss die for-schleife aussehen, damit ich nur alle Feldwerte der Spalte "Regel20" ausgegeben bekomme ?

Verfasst: Dienstag 18. April 2006, 13:29
von gerold
stigi hat geschrieben:für was stehen die 1 und die 3?
Hi stigi!

http://msdn.microsoft.com/library/defau ... stopen.asp

Die ADO-Konstanten findest du in "C:\Programme\Gemeinsame Dateien\System\ado\adovbs.inc".

Aber ich würde trotzdem lieber bei der Python-typischen Methode bleiben. Die ist durchschaubarer, überhaupt dann wenn man keine Ahnung von ADO (ActiveX Data Object) hat.

Verwende doppelte Backslashes (\\), dann sollte das andere Beispiel funktionieren.

Code: Alles auswählen

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb')
mfg
Gerold
:-)

Verfasst: Dienstag 18. April 2006, 13:36
von stigi
ahja ok mit den doppelten klappts :D

kannst du mir dann noch eben schnell verraten wie ich damit

Code: Alles auswählen

import dbi 
import odbc 

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\temp\T100_V46.mdb') 
mycursor = myconn.cursor() 
mycursor.execute('SELECT * FROM REGEL20') 
mydata = mycursor.fetchall() 
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann ? und den Spaltennamen?! so gibt er mir ja jetzt alle werte von den ersten beiden Zeilen der Tabelle aus.

Verfasst: Dienstag 18. April 2006, 14:05
von Joghurt

Code: Alles auswählen

SELECT INFO FROM REGEL20
Ein gutes SQL-Tutorial (wo du die Sachen gleich direkt ausprobieren kannst) gibt es hier: http://www.sqlzoo.net

Verfasst: Dienstag 18. April 2006, 14:08
von icepacker
stigi hat geschrieben: dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann ? und den Spaltennamen?! so gibt er mir ja jetzt alle werte von den ersten beiden Zeilen der Tabelle aus.
Das ist dann aber nicht mehr Python spezifisch guck dir also am Besten ein Sql
Tutorial an.

Nichtsdesdotrotz hier wieder eine Vermutung von mir :wink: :

Code: Alles auswählen

mycursor.execute('SELECT Info FROM REGEL20')
mydata = mycursor.fetchall()
mycursor.close()
myconn.close()
for row in mydata:
    print row
Das Format für die Query ist also: "SELECT spaltenname FROM tabellename"
Ich hoffe die Schleife(Z.5) ist jetzt richtig. Mit den Python for-Schleifen bin
ich noch nicht so sicher :oops: Also musst du vlt. anpassen.

Ansonsten stimmts jetzt glaub ich :wink:

lg icepacker

Verfasst: Dienstag 18. April 2006, 14:09
von gerold
stigi hat geschrieben:dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann?
Hi stigi!

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 Info, IrgendeinFeld FROM Regel20"
cur.execute(sql)
rows = cur.fetchall()
cur.close()
conn.close()

for row in rows:
    # Info = 0, da es als erstes in der SQL-Anweisung auftaucht
    # IrgendeinFeld = 1, da es als zweites in der SQL-Anweisung auftaucht
    print "Info:", row[0]
    print "IrgendeinFeld:", row[1]
mfg
Gerold
:-)

Verfasst: Dienstag 18. April 2006, 14:12
von stigi
ahh danke, werd ich mir anschaun, ich hoffe ich kann wieder auf euch zurückkommen, falls doch nochmal fragen auftauchen sollten :D

Verfasst: Dienstag 18. April 2006, 14:17
von stigi
gerold hat geschrieben:
stigi hat geschrieben:dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann?
Hi stigi!

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 Info, IrgendeinFeld FROM Regel20"
cur.execute(sql)
rows = cur.fetchall()
cur.close()
conn.close()

for row in rows:
    # Info = 0, da es als erstes in der SQL-Anweisung auftaucht
    # IrgendeinFeld = 1, da es als zweites in der SQL-Anweisung auftaucht
    print "Info:", row[0]
    print "IrgendeinFeld:", row[1]
mfg
Gerold
:-)
wenn ich das so mach kommt bei mir das hier

Traceback (most recent call last):
File "Y:\Mitarbeiter\muster\pythonwin\spe2.py", line 7, in ?
cur.execute(sql)
dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 2 Parameter wurden
erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC

Verfasst: Dienstag 18. April 2006, 14:47
von icepacker
Hi
Ich tippe mal darauf das als 2. Parameter die
Verbindungskennung( Connection ID, Resource link identifier, wie mans eben nennen wil :wink: )
erwartet wird...

lg icepacker

Verfasst: Dienstag 18. April 2006, 14:56
von gerold
Hi stigi!

--->>> IrgendeinFeld <<<--- ???

Hast du das durch einen real **existierenden** Feldnamen ausgetauscht?

mfg
Gerold
:-)

PS: Die Fehlermeldungen beim ODBC von pywin32 können täuschen...

Verfasst: Dienstag 18. April 2006, 14:59
von gerold
icepacker hat geschrieben:Hi
Ich tippe mal darauf das als 2. Parameter die
Verbindungskennung( Connection ID, Resource link identifier, wie mans eben nennen wil :wink: )
erwartet wird...
Hi icepacker!

Das passt mit Sicherheit! Da wird nichts mehr benötigt. Die Verbindung wurde bereits geerbt und muss nicht noch einmal übergeben werden. In solchen Fällen muss man unbedingt die übergebene SQL-Anweisung überprüfen, da die Fehlermeldungen vom ODBC (des pywin32) sch... sind.

Code: Alles auswählen

cur.execute(sql)
mfg
Gerold
:-)

Verfasst: Dienstag 18. April 2006, 15:19
von icepacker
gerold hat geschrieben: Hi icepacker!

Das passt mit Sicherheit! Da wird nichts mehr benötigt. Die Verbindung wurde bereits geerbt und muss nicht noch einmal übergeben werden. In solchen Fällen muss man unbedingt die übergebene SQL-Anweisung überprüfen, da die Fehlermeldungen vom ODBC (des pywin32) sch... sind.

Code: Alles auswählen

cur.execute(sql)
mfg
Gerold
:-)
Dann kapiere ich aber nicht warum er schon in dieser Zeile 7 meckert :?

Bei deinem angesprochenem Problem sollte er imo erst hier meckern:

Code: Alles auswählen

rows = cur.fetchall()
lg icepacker

edit: Hab nochmal nachgeguckt, dass was ich geschrieben habe scheint doch
nicht zu stimmen. Jetzt bin ich noch verwirrter...