Ein kleines Beispiel für ODBC am Beispiel von MS Access.

Code-Stücke können hier veröffentlicht werden.
2bock
User
Beiträge: 94
Registriert: Freitag 12. September 2003, 07:58
Wohnort: 50.9333300 / 6.3666700

Dienstag 21. September 2004, 09:58

Hier ein kleines Beispiel um z.B. eine MS Access Datanbank mit ODBC anzusprechen.

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]
Viel Spaß mit dem Sourcecode

Greetz from 2bock :wink:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Dienstag 21. September 2004, 12:03

Hi 2bock,

schöne Beispiele.
Seit einiger Zeit, haben wir auch Python-Tags statt der Code-Tags für Pythoncode. Ich hab Deine Beispiele mal dementsprechend editiert.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
2bock
User
Beiträge: 94
Registriert: Freitag 12. September 2003, 07:58
Wohnort: 50.9333300 / 6.3666700

Dienstag 21. September 2004, 12:13

Siehe Titel

:wink:
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 10. November 2004, 18:26

Wo gibt es denn die dbi und odbc module zum download???
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 10. November 2004, 20:42

Habe das hier gefunden:
http://www.egenix.com/files/python/mxODBC.html

Sind aber nicht die dbi und odbc Module...

Ich kenne mich mit Datenbanken überhaupt nicht aus, ich möchte gern eine *.mdb Datei zugreifen können...
2bock_not_logged

Donnerstag 11. November 2004, 08:58

Ja damit kannst du es auch versuchen.

Sonst schau acuh mal unter http://www.python.org/peps/pep-0249.html
nach.
Die hier beschrieben api halte ich sogar für etwas sinnvoller als mit einer odbc schnittstelle zu arbeiten. Diese muß man nämlich immer erst auf dem Zielrechner anlegen und kann dann erst mit der datenbank kommunizieren. Ich würde mich lieber an die api halten. Die kann man als eine art standard verstehen.

Gruß 2bock :wink:
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 11. November 2004, 09:08

Ok, ich hab jetzt herraus gefunden, das man die Win32all Extensions von Mark Hammond http://starship.python.net/crew/mhammond/ installieren muß... Oder? Zumindest hab ich dann die Module dbi und odbc verfügbar...

Hab hier mal ein kleines Skript zum "angucken" der Datenbankinhalte geschrieben:

Code: Alles auswählen

import dbi, odbc

def dump(TabellenName):
    mycursor = myconn.cursor()
    mycursor.execute('SELECT * FROM '+TabellenName)
    mydata = mycursor.fetchall()

    for i in range( len(mydata) ):
        print i,mydata[i]

    mycursor.close()


myconn = odbc.odbc('DatenBankName')

dump("Index")

myconn.close()
In dieser Variante muß ich zuerst im Windoof "ODBC-Datenquellen-Administrator" die *.mdb Datei als Datenquelle eintragen...
Kommt man mit der API Geschichte ohne den Windows ODBC aus?

Hast du mal einen kleine Codeschnipsel für mich?

Noch ne frage... Ist die "Index" Tabell immer in einer *.mdb vorhanden? Oder wie komme ich sonst an die vorhandenen Tabellennamen dran?
2bock_not_logged

Montag 22. November 2004, 12:30

Hi jens.

Also klar kommst Du auch ohne die ODBC Geschichte aus.

Das hier ist jetzt ein weiterer weg ohne ODBC. Schau aber noch mal hier im Forum. Ich hab schon ein paar einträge gemacht wo das enweder von mir oder von anderen genauer besprochen worden ist.

Aber hier der 2 Weg.:

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=//PC1/c$/WINDOWS/system32/ias/dnary.mdb;'
conn.Open(DSN)

rs = win32com.client.Dispatch(r'ADODB.Recordset')
rs.Open('SELECT * FROM Attributes', 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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 9. Februar 2005, 09:49

Dazu braucht man aber auch pywin32, daran führt kaum ein Weg vorbei.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 9. Februar 2005, 11:21

jens hat geschrieben:In dieser Variante muß ich zuerst im Windoof "ODBC-Datenquellen-Administrator" die *.mdb Datei als Datenquelle eintragen...
Kommt man mit der API Geschichte ohne den Windows ODBC aus?
Hallo Jens!

odbc.odbc kann auch mit einem DSN-String gefüttert werden.
Wenn du im Windows ODBC-Datenquellen-Admin eine Datei-DSN erstellst, dann wird der DSN-String in eine Datei gespeichert. Öffne diese Datei mit einem Texteditor, lösche die Zeile [ODBC] raus und ersetze die Zeilenumbrüche durch Strichpunkte (;). Was du dann hast, ist der DSN-String, den du direkt an odbc.odbc übergeben kannst.

Diesen DSN-String kannst du auch kürzen. Ich habe es noch nicht versucht, aber ich glaube, dass die wichtigsten Einträge diese sind:
- DBQ
- DRIVER
- UID

Dein Aufruf könnte also so aussehen:

Code: Alles auswählen

odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=PFAD_ZUR_MDBDATEI')
mfg
Gerold
:-)
Zuletzt geändert von gerold am Mittwoch 9. Februar 2005, 11:27, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 9. Februar 2005, 11:25

Gibt es dazu evtl. ein Skript, mit dem man diesen DSN-String automatisch generieren kann?
Sodas man wirklich nur den Pfad zur *.mdb Datei angeben muß und schon kann man loslegen?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 9. Februar 2005, 11:28

jens hat geschrieben:Gibt es dazu evtl. ein Skript, mit dem man diesen DSN-String automatisch generieren kann?
Sodas man wirklich nur den Pfad zur *.mdb Datei angeben muß und schon kann man loslegen?
Hallo Jens!

Einen funktionierenden Beispielaufruf habe ich soeben meinem Beispiel hinzugefügt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 9. Februar 2005, 11:31

Da fällt mir noch ein, man sollte evt. den englischen Treibernamen verwenden, da der deutsche wahrscheinlich nur beim Installieren eines deutschen Access zur Verfügung steht.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 18. November 2005, 14:01

So, hab mir mal den kostenlosen "SQL Server 2005 Express Edition" installiert und eine Datenbank eingerichtet. Allerdings schaffe ich es nicht im ODBC-Datenquellen-Administrator eine Datenbank "freizugeben"...

Die Datenbanken sind sind *.mdf-Dateien unter C:\Programme\Microsoft SQL Server\MSSQL.1\MSSQL\Data

Möchte halt mit Python's win32 an die Datenbanken andocken... Oder gibt es da einen direkteren Weg ohne ODBC?

EDIT: Gerade was gefunden:
http://www.time-travellers.org/shane/ho ... HOWTO.html

EDIT2: Aha, die Seite hat geholfen ;) Ich hab nicht gewusst, das der Servername ".\SQLEXPRESS" heißen muß, der stand nämlich nicht zu auswahl und "(local)" hat nicht funktioniert...

Also eine Benutzerdatenquelle hab ich damit schonmal erstellt...

Nun hab ich aber noch Probleme mit der Rechteverwaltung:
dbi.operation-error: [Microsoft][SQL Native Client][SQL Server]Login failed for user 'UserName'. The user is not associated with a trusted SQL Server connection. in LOGIN
Das selbe Problem hab ich aber auch im ODBC-Datenquellen-Administrator...
Einfach conecten mit conn=odbc.odbc("DSN=odbc-moo-cows") geht nicht...

EDIT3:
Also es gibt dazu auch einen Knowledge Base Artikel. Demnach muß man den Authentifizierungsmodus auf "Mixed Mode (Windows Authentication and SQL Server Authentication)" umstellen... Das Problem ist aber, das man es eigentlich nur während der Installation einstellen kann :twisted:
Nach langem suchen hab ich eine Lösung gefunden. Demnach kann man es in der Reg einstellen:

Code: Alles auswählen

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer
Den Wert von Key "LoginMode" muß man von "1" auf "2" setzten...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 18. November 2005, 15:58

gerold hat geschrieben:Dein Aufruf könnte also so aussehen:

Code: Alles auswählen

odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=PFAD_ZUR_MDBDATEI')
Also ich hab es jetzt soweit, das ich mir eine *.dsn Datei generieren kann. Der Test beim ODBC-Datenquellen-Administrator klappt nun auch.

Code: Alles auswählen

[ODBC]
DRIVER=SQL Server
UID=UserName
Network=DBMSSOCN
WSID=VMWARE
APP=Microsoft Data Access Components
SERVER=.\SQLEXPRESS
Die Auth. ist nun auf SQL-Auth festgelegt... Aber wie kann ich ein Passwort mitschicken???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten