Seite 1 von 2

ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 09.01.2019 21:26
von ccode_new
Geschichte:

Zitat:
iODBC Configuration Script
iODBC Driver Manager 3.52.9
Copyright (C) 1996-2014 OpenLink Software
Please report all bugs to <iodbc@openlinksw.com>

iodbc-config --libs
-L/usr/lib/x86_64-linux-gnu -liodbc -liodbcinst

Bei PureBasic bekomme ich immer nur:

/usr/bin/ld: cannot find -lodbc
collect2: error: ld returned 1 exit status

...

Ich habe das hier installiert:

sudo apt-get install libiodbc2-dev
______________________________
Ich habe ein paar Änderungen gemacht, da eine normale IODBC -Installation bei mir nicht funktioniert.

Im Verzeichnis "/usr/lib/x86_64-linux-gnu" habe ich die installierten Libs "iodbc" und "iodbcinst" einfach manuell in "odbc" und "odbcinst" umgenannt.

Jetzt kommt bei:

Debug UseODBCDatabase()

folgendes: 94740839224784
(Also keine Null und die Lib wird auch gefunden.)
Es wird aber leider immer per Standard-Installation auch eine Lib "odbc" im oben genannten Verzeichnis installiert (diese habe ich gelöscht (weil diese irgendwie nicht vom "ld" gefunden wird, obwohl diese genau so heißt) und gegen die umbenannte "iodbc"-Lib ersetzt.)

Jetzt habe ich mir mal eine Test-ODBC-Datenbank heruntergeladen, aber nach dem Öffnen hängt sich PureBasic auf.

Wenn ich es so versuche:
If CreateFile(0, DatabaseFile$)
...
If OpenDatabase(0, DatabaseFile$, "", "", #PB_Database_ODBC)
(Also eine leere Datenbank, oder ?)

kommt nur: Can't open database !


Hat jemand Tipps ?

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 09.01.2019 22:04
von ccode_new
Wie muss ich, bzw muss ich "/etc/odbcinst.ini" und/oder "/etc/odbc.ini" noch irgendwie konfigurieren ?

Wie muss das konfiguriert werden ?
Bsp:
[testing]
Description = Meine Datenbank
Driver = TestDriver
Server = 127.0.0.1
Database = tolleDB
UID = root
PWD = tolleDB
[TestDriver]
Description = TestDriver
Driver = /usr/lib/x86_64-linux-gnu/libodbc.so
Setup = /usr/lib/x86_64-linux-gnu/libodbc.so

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 10.01.2019 00:24
von ts-soft
Linux hat früher IODBC genutzt, nutzt aber inzwischen UnixODBC, da IODBC nicht immer im Paketmanager verfügbar!
Ob diese jetzt Kompatibel sind oder es egal ist, welchen man nutzt, kann ich aber nicht sagen.

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 10.01.2019 01:57
von mk-soft
Wollte mich auch mal wieder damit beschäftigen nach der Umstellung auf unixODBC

Zur installation der aktuellen Version
sudo apt-get install unixodbc-dev unixodbc-bin unixodbc
Link zu unixODBC und in diesen weitere link zu dem Datenbank Treibern

http://www.unixodbc.org/

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 11.01.2019 19:15
von ccode_new
Hallo mk-soft!

Ich hatte es auch erst mit "unixodbc" probiert, da lieferte PureBasic aber nur haufen Fehlermeldungen das es Funktion "xyz" nicht finden kann.

Mit den umgenannten "iodbc" - Libs ging es dann.
PureBasic konnte die Lib finden und linken.
Aber eine Erstellung/Verbindung zu einer Datenbank war unmöglich.

Ich habe dann mal komplett aufgeräumt und jetzt auch teilweise manuell Pakete aus dem Verzeichnis "/var/lib/dpkg/info" gelöscht, weil Synaptic sich absolut weigerte Abhängigkeiten aufzulösen/ bzw. Pakete auch nicht mehr mit "--force" deinstallierte.
Ich habe dann fehlerhafte "odbc-Dateien" manuell gelöscht und alles was mit ODBC zutuen hat.

Danach habe ich "sudo apt-get install unixodbc-dev unixodbc-bin unixodbc" installiert und es scheint zu funktionieren.

Trotzdem brauche ich eigentlich kein ODBC unter Linux.
(Ist schon ganz schön nervig mit dieser Treiber-Geschichte)

100% zufrieden bin ich aber noch nicht, weil ich bis jetzt nur bis zu dieser Fehlermeldung gekommen bin:
"Can't open database !"

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 11.01.2019 19:51
von mk-soft
Ist schon nervig das mit den Datenbanken zum zu laufen bekommen (Bis jetzt noch nicht hin bekommen)

Bis jetzt habe ich das auch nicht gebraucht und verwende in der Regel SQLite.

Dafür funktioniert jetzt aber MySQL mit "libmariadb.so" für Linux und "libmariadb.dylib" für MacOS, sowie "libmariadb.dll".
Ich habe ein Buffalo-NAS mit MySQL Datenbank. Funktioniert super schnell.

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 12.01.2019 00:04
von ccode_new
Hallo mk-soft,

ja das klingt interessant.

Warum gibt es eigentlich laut Hilfe eine Konstante "#PB_Database_MySQL", die PureBasic aber garnicht kennt ?

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 12.01.2019 00:36
von ts-soft
Warum gibt es eigentlich laut Hilfe eine Konstante "#PB_Database_MySQL", die PureBasic aber garnicht kennt ?
Da hat wohl jemand geschlafen :mrgreen:
PB sollte die eigentlich kennen. Dient der Nutzung der MySQL Datenbank, wenn OpenDatabase()
Wird wahrscheinlich = 4 sein.

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 12.01.2019 02:36
von mk-soft
Es ist Vier...

Code: Alles auswählen

;-TOP

;IncludeFile "mysql.pbi"

; ---------------------------------------------------------------------------------------

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS

  Procedure.s GetAppPath()
    Protected bundlePathPtr = CocoaMessage(0,CocoaMessage(0,CocoaMessage(0,0,"NSBundle mainBundle"),"bundlePath"),"UTF8String")
    If bundlePathPtr
      Protected bundlePath.s = PeekS(bundlePathPtr,-1,#PB_UTF8) + "/"
    EndIf
    ProcedureReturn bundlePath
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure.s GetResourcePath()
    Protected bundlePathPtr = CocoaMessage(0,CocoaMessage(0,CocoaMessage(0,0,"NSBundle mainBundle"),"resourcePath"),"UTF8String")
    If bundlePathPtr
      Protected bundlePath.s = PeekS(bundlePathPtr,-1,#PB_UTF8) + "/"
    EndIf
    ProcedureReturn bundlePath
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  
  libdb.s = GetAppPath() + "Contents/Library/libmariadb.dylib"
  
  
  If UseMySQLDatabase(libdb) = 0
    Debug "Error MySQL"
    End
  EndIf
  
CompilerElse
  
    If UseMySQLDatabase() = 0
    Debug "Error MySQL"
    End
  EndIf
  
CompilerEndIf


UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
  Result = DatabaseUpdate(Database, Query$)
  If Result = 0
    Debug "Error Update: " + DatabaseError() + #LF$ + Query$
  EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure CheckDatabaseQuery(Database, Query$)
  Result = DatabaseQuery(Database, Query$)
  If Result = 0
    Debug "Error Query: " + DatabaseError() + #LF$ + Query$
  EndIf
  
  ProcedureReturn Result
EndProcedure

database.s = "host=server port=3306 dbname=developer"
user.s = "developer"
pass.s = "purebasic"

CompilerIf Defined(PB_Database_MySQL, #PB_Constant) = 0
  #PB_Database_MySQL = 4
CompilerEndIf
    
If OpenDatabase(0, database, user, pass, #PB_Database_MySQL)
  CheckDatabaseUpdate(0, "CREATE TABLE IF NOT EXISTS food (name CHAR(50), weight INT)")
  CheckDatabaseUpdate(0, "DELETE FROM food")
  
  CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '12')")
  CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
  CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '25')")
  
  If CheckDatabaseQuery(0, "SELECT * FROM food WHERE weight > 0")
    While NextDatabaseRow(0)
      Debug "Food = " + GetDatabaseString(0, 0) + " Weight = " + GetDatabaseLong(0, 1)
    Wend
    FinishDatabaseQuery(0)
  EndIf
  
  CloseDatabase(0)
Else
  Debug "Can't open database !"
  CallDebugger
EndIf
P.S.
Ach ja,
Für MacOS verwende ich das Tool MyAppData um die Lib mit in die App zu packen...
Link: https://www.purebasic.fr/english/viewto ... 19&t=61638

Re: ODBC-Datenbankzugriff unter Linux für Dummies

Verfasst: 12.01.2019 14:02
von ccode_new
Hallo!

Ja 4 stimmt!

Das mit dem MySQL /MariaDB ist toll, weil es funktioniert und schneller ist als SQLLite.

Aber auch viel umständlicher mit der Konfigurierung.

Ich musste erst ein Passwort für den Benutzer "root" setzten, weil sonst kein Zugriff möglich war.
Auch konnte ich keine Verbindung über "localhost" herstellen, sondern musste "host=127.0.0.1" schreiben. (Was eigentlich das selbe ist, oder ?)
Mit einem anderen angelegten Benutzer (außer root) konnte ich bisher noch keine Verbindung aufbauen.

Aber ich kann jetzt wenigstens ohne "sudo " einfach nur per "mysql" auf das "Config-Tool" zugreifen.