Seite 1 von 1

[gelöst] Datenbank-Anbindung

Verfasst: 20.01.2016 12:12
von habchr
Hallo miteinander

Bin frisch registriert nachdem ich mir PureBasic erworben habe.
Ich beschäftige mich privat vor allem mit Datenbanken, früher vor allem MS Access und seit einiger Zeit mit Libre0ffice/OpenOffice. In MS Access kann man keine Executables erstellen ohne wieder viel Geld auszugeben und LibreOffice läuft für meinen Geschmack reichlich unstabil und Executables sind nicht möglich. Darum bin ich auf PureBasic gestossen und möchte mich einarbeiten.

Und schon habe ich das erste Problem: Der Datenbank-Zugriff. Meine Suche hier und im englischen Forum hat wenig bis gar nichts erbracht.

Zuerst versuchte ich es bei LibreOffice in der Meinung das sei eine ODBC-Datenbank. Hat nicht funktioniert. Also habe ich es mit MS Access versucht, die definitiv eine ODBC-Datenbank ist. Auch hier Fehlanzeige. Mit dem Befehl "UseODBCDatabase()" bekomme ich die Meldung "OpenDatabase() fehlgeschlagen". Wenn ich den Befehl in "UseSQLiteDatabase()" umwandle gibt es keine Datenbank-Fehlermeldung, dafür gibt es eine DatabaseQuery()-Fehlermeldung.

Es wäre auch möglich die Datenbank-Dateien in .csv- oder .txt-Dateien umzuwandeln und damit zu arbeiten. Das habe ich versucht und es funktioniert. Allerdings ist das ein eher mühsamer Weg und in der MessageRequester-Ausgabe werden für Umlaute nur "?" ausgegeben.

Ich füge mein eigenes Programm hinzu zur Kontrolle, welches auch noch Listenbefehle enthält, und dann noch eines, welches ich aus einem Forum habe, ohne genau zu wissen was ich da tue. Hat auch nicht funktioniert. Was mache ich falsch? Es ist sehr wohl möglich, dass ich grundsätzlich etwas nicht verstanden habe! Die Dokumentation für diese Art Probleme ist etwas dürftig. Ich wäre sehr dankbar um Hilfe.

Zuerst mein eigenes Programm:

Code: Alles auswählen

EnableExplicit

#DATENBANK = 1
Define.i iAnzahl
Define.s sTabelle, sAusgabe
NewList Artikel.s()

Declare Fehlerbehandlung(Ergebnis.i, Text.s)

UseODBCDatabase()

Fehlerbehandlung(OpenDatabase(#DATENBANK, "D:\Daten\BIBLIO\BIBLIO Test\Database1.accdb", "", ""), "OpenDatabase() fehlgeschlagen.")

OpenDatabase(#DATENBANK, "D:\Daten\BIBLIO\BIBLIO Test\Database1.accdb", "", "")

If DatabaseQuery(#DATENBANK, "SELECT * FROM Artikel")
  
  iAnzahl = 0
  
  While NextDatabaseRow(#DATENBANK)
    AddElement(Artikel())
    Artikel() = GetDatabaseString(#DATENBANK, 0)
    iAnzahl = iAnzahl + 1
  Wend
  
  FinishDatabaseQuery(#DATENBANK)  
  CloseDatabase(#DATENBANK)

  ForEach Artikel()
    Debug Artikel()
  Next
  
  Debug "Anzahl Datensätze: " + Str(iAnzahl)
  
Else
  
  Fehlerbehandlung(DatabaseQuery(#DATENBANK, "SELECT * FROM Artikel"), "DatabaseQuery() fehlgeschlagen.")
  
EndIf

Procedure Fehlerbehandlung(Ergebnis.i, Text.s)
  If Ergebnis = 0
    MessageRequester("Fehler", Text, #PB_MessageRequester_Ok)
    End
  EndIf
EndProcedure
Jetzt noch das zweite:

Code: Alles auswählen

;uses AgeRange.mdb as the data source, downloadable from:
;1. http://www.ms-access2010.com/tutorials/download.html (samples database zip file)
;2. https://dl.dropboxusercontent.com/u/171258023/AgeRange.mdb

UseODBCDatabase()
#ODBC_ADD_DSN = 1

dbFile$ = OpenFileRequester("Select database", GetCurrentDirectory(),
                            "Access Files|*.mdb;*.accdb", 0)
If dbFile$
  If SQLConfigDataSource_(#Null, #ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb, *.accdb)",
                          "Server=127.0.0.1; Description=dbDescription; " +
                          "DSN=dbSourceName; DBQ=" + dbFile$ + "; UID=; PWD=;")
    If OpenDatabase(0, "dbSourceName", "", "", #PB_Database_ODBC)
      ;reading from the [tblEmployess] table
      If DatabaseQuery(0, "Select * From tblEmployees")
        While NextDatabaseRow(0)
          Debug GetDatabaseString(0, 2) + " " + GetDatabaseString(0, 1)
        Wend
      Else 
        MessageRequester("ODBC", DatabaseError())
      EndIf
      CloseDatabase(0)
    Else
      MessageRequester("ODBC", DatabaseError())
    EndIf   
  Else
    MessageRequester("ODBC", "ODBC initialisation error!")
  EndIf
EndIf

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 12:21
von Bisonte
Der eigentliche Haken bei ODBC ist OpenDataBase().

Man muss als DatenBankName$ Parameter nicht den Filenamen angeben, sondern den Namen, den man in den ODBC Einstellungen
vergeben hat.

(Ich hoffe ich hab mich da jetzt nicht verguckt ... )

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 13:46
von habchr
Bisonte hat geschrieben:Man muss als DatenBankName$ Parameter nicht den Filenamen angeben, sondern den Namen, den man in den ODBC Einstellungen vergeben hat.
Vielen Dank für deine Antwort.

Leider verstehe ich nicht was du meinst. Wo sind diese ODBC-Einstellungen? Ich kann mich nicht erinnern irgendwo einen Namen für die Datenbank vergeben zu haben.

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 15:17
von Kiffi
habchr hat geschrieben:Wo sind diese ODBC-Einstellungen?
Systemsteuerung -> Verwaltung -> Datenquellen (ODBC)

In OpenDatabase() trägst Du dann den Namen ein, den Du Deiner ODBC-Verbindung gegeben hast.

Grüße ... Peter

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 17:04
von habchr
Kiffi hat geschrieben:Systemsteuerung -> Verwaltung -> Datenquellen (ODBC). In OpenDatabase() trägst Du dann den Namen ein, den Du Deiner ODBC-Verbindung gegeben hast.
Vielen Dank für diese Hilfestellung. Ich konnte eine ODBC-Verbindung konfigurieren. Mit der 64-Bit Version geht es schon mal gar nicht. Da kann man nur eine Verbindung mit einem SQL-Server herstellen. Also nahm ich die 32-Bit Version und erstellte eine neue Datembank und habe den zugewiesenen Namen in OpenDatabase() eingetragen.

Leider bekomme ich nach wie vor eine Fehlermeldung und kann keine Verbindung herstellen.

Vielen Dank für eure Bemühungen!

Christoph

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 20:13
von Kiffi
habchr hat geschrieben:Leider bekomme ich nach wie vor eine Fehlermeldung
wie lautet die Fehlermeldung?

Grüße ... Peter

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 21:05
von habchr
Kiffi hat geschrieben:wie lautet die Fehlermeldung?
Die Meldung lautet:
[Microsoft][ODBC Driver Manager] Der angegebene DSN weist eine nicht übereinstimmende Architektur von Treiber und Anwendung auf.

Christoph

Re: Datenbank-Anbindung

Verfasst: 20.01.2016 21:19
von ts-soft
habchr hat geschrieben:Die Meldung lautet:
[Microsoft][ODBC Driver Manager] Der angegebene DSN weist eine nicht übereinstimmende Architektur von Treiber und Anwendung auf.
Und was sagt uns das :wink:

Du nutzt eine 32-Bit DB und ein 64-Bit Programm (oder umgekehrt) und das geht nicht. Da die meisten ODBC-Treiber
nur unter 32-Bit nutzbar sind, würde ich ein 32-Bit Programm erstellen, also entsprechende PB Version installieren.

Gruß
Thomas

Re: Datenbank-Anbindung [gelöst]

Verfasst: 20.01.2016 22:17
von habchr
ts-soft hat geschrieben:Und was sagt uns das
Du nutzt eine 32-Bit DB und ein 64-Bit Programm (oder umgekehrt) und das geht nicht. Da die meisten ODBC-Treiber
nur unter 32-Bit nutzbar sind, würde ich ein 32-Bit Programm erstellen, also entsprechende PB Version installieren.
Perfekt! Vielen Dank für deine Hilfe. 32-Bit Version von PureBasic installiert und alles funktioniert bestens.
Eure 2 entscheidenden Hinweise haben das Ganze zum Laufen gebracht und ich habe sehr viel dabei gelernt.

Herzlichen Dank
Christoph