[gelöst] Datenbank-Anbindung

Anfängerfragen zum Programmieren mit PureBasic.
habchr
Beiträge: 5
Registriert: 20.01.2016 11:25

[gelöst] Datenbank-Anbindung

Beitrag 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
Zuletzt geändert von habchr am 21.01.2016 08:24, insgesamt 1-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Datenbank-Anbindung

Beitrag 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 ... )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
habchr
Beiträge: 5
Registriert: 20.01.2016 11:25

Re: Datenbank-Anbindung

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Datenbank-Anbindung

Beitrag 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
a²+b²=mc²
habchr
Beiträge: 5
Registriert: 20.01.2016 11:25

Re: Datenbank-Anbindung

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Datenbank-Anbindung

Beitrag von Kiffi »

habchr hat geschrieben:Leider bekomme ich nach wie vor eine Fehlermeldung
wie lautet die Fehlermeldung?

Grüße ... Peter
a²+b²=mc²
habchr
Beiträge: 5
Registriert: 20.01.2016 11:25

Re: Datenbank-Anbindung

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Datenbank-Anbindung

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
habchr
Beiträge: 5
Registriert: 20.01.2016 11:25

Re: Datenbank-Anbindung [gelöst]

Beitrag 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
Antworten