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!
wär cool wenn trotzdem noch jemand bei gelegenheit meine frage genau beantworten könnte
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
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
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
, 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
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
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
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
:
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
Also musst du vlt. anpassen.
Ansonsten stimmts jetzt glaub ich
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
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
)
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
)
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.
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.
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:
lg icepacker
edit: Hab nochmal nachgeguckt, dass was ich geschrieben habe scheint doch
nicht zu stimmen. Jetzt bin ich noch verwirrter...