PBOSL_ExDatabase lib

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

(EDIT)
Da MySQL etrwas anders funktioniert vielleicht noch hinzufügen

Um nicht mit anderen Programmen in Konflikt zu kommen und den falschen DSN zu entfernen, einen eindeutigen DSN-Name erzeugen. Vielleicht aus Programmname und Datenbankname zusammensetzen und diesen aus der Funktion AddDSN zurückgeben.

RemoveDSN ist leider nicht erfolgreich?

Code: Alles auswählen

  Code entfernt. siehe Link.
FF :wink:

P.S. @ts-soft
http://www.purebasic.fr/german/viewtopi ... 986#162986
Zuletzt geändert von mk-soft am 30.08.2007 13:51, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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

Beitrag von ts-soft »

danke schön,

wenn ich engl. könnte wäre die Lib ja schon lange fertig. Jetzt hab ich erstmal
keine Zeit mehr, bzw. ab ende der Woche erstmal kein Inet.

Eilt ja nicht. kann man ja so nutzen.
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
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hi,

da ts-soft zur Zeit nicht zur Verfügung steht, führe ich das Projekt weiter.

Die LIB unterstützt jetzt folgende Datendanken:
- MDB, XLS, DBASE, CSV und TXT, MySQL und M$ SQL Server

Funktionsbeschreibung:
Funktionsbeschreibung:

Result.l = ExamineTables(DSN.s [, USER.s, PASS.s])
Result.l = NextTable()
Result.s = GetTableName()
Result.s = GetTableType()

Result.s = AddDSN(databasename.s [, user.s, pass.s][, driver.s]) - Result <- User DSN Name
Result.l = RemoveDSN(databasename.s [, driver.s])

Result.s = AddSystemDSN(databasename.s [, user.s, pass.s][, driver.s]) - Result <- System DSN Name
Result.l = RemoveSystemDSN(databasename.s [, driver.s])

Result.l = RepairMDB(databasename.s [, user.s, pass.s])
Result.l = CompactMDB(databasename.s [, user.s, pass.s])
Result.l = CreateEmptyMDB(databasename.s [, user.s, pass.s])


Unterstützte Datenbanken und verwendete Standardtreiber:

*.MDB -> "Microsoft Access Driver (*.mdb)"
*.XLS -> "Microsoft Excel Driver (*.xls)"
*.DBF -> "Microsoft dBase Driver (*.dbf)"
*.CSV -> "Microsoft Text Driver (*.txt; *.csv)"
*.TXT -> "Microsoft Text Driver (*.txt; *.csv)"

*.MySQL -> "MySQL ODBC 3.51 Driver"
*.MsSQL -> "SQL Server"


Format für MySQL:

databasename = "[Host oder IP[:Port]\]Schema.MySQL", z.B. "InternetHost:3317\information_schema.mysql"
Bei fehlenden Host oder IP wird automatisch "localhost" gesetzt.


Format für SQL Server:

databasename = "SQLServer\Tabelle.MsSQL", z.B. "(local)\SQLEXPRESS\Master.MsSQL"
Hinweis: Parameterfolge hat sich geändert und "AddDSN(...)" liefert jetzt den zu verwendeten DSN Name zurück.

Update v1.04

Download

FF :wink:

P.S. Angepasster Testcode (DSN)

Code: Alles auswählen

; Original by PAMKKKKK
; angepaßt für PBOSL_ExDatabase und PB4 by ts-soft und mk-soft

EnableExplicit

UseODBCDatabase()
;InitDatabase()

Define.s dbName = "c:\exDatabase_test.mdb" ; könnt Ihr anpassen
Define.s DSN
Define.s SQL
Define.l db = 0
Define.l result 

If CreateEmptyMDB(dbName) ; leere Datenbank erstellen
  dsn = AddDSN(dbName, "User", "PASS") ; DSN hinzufügen
EndIf
Debug "DSM=" + dsn
; Datenbank verbinden
If OpenDatabase(db, DSN, "", "") = 0
  End
EndIf

If IsDatabase(db)
  Debug "Start..."
  ; SQL Befehl zum Tabelle erstellen
  SQL = "Create table Adress (id autoincrement, vorname text(50), nachname text(50), constraint Adress unique(id));"
  If DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    ; SQL Befehl zum einfügen von Daten in die Tabelle
    SQL = "Insert into Adress (vorname, nachname) values ('Thomas', 'Schulz')"
    DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    SQL = "Insert into Adress (vorname, nachname) values ('Max' ,'Mustermann')"
    DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    SQL = "Insert into Adress (vorname, nachname) values ('Erika', 'Mustermann')"
    DatabaseQuery(db, SQL) ; SQL Befehl ausführen
  Else
    Debug DatabaseError()
  EndIf
  
  ; SQL Befehl zum Auslesen von Daten der Tabelle
  SQL = "Select * from Adress order by nachname asc;"
  If DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    Debug "Daten in Tabelle 'Adress'" : Debug ""
    While NextDatabaseRow(db) ; gelesene Daten aus der Datenbank durchlaufen
      Debug Str(GetDatabaseLong(db, 0)) + ": " + GetDatabaseString(db, 1) + " " + GetDatabaseString(db, 2) ; gelesene Daten aus der Datenbank ausgeben
    Wend
  EndIf
  CloseDatabase(db)
EndIf

; Tabellen lesen
If ExamineTables(dsn)
  Debug "Tabellen in Database:"
  Debug ""
  While NextTable()
    Debug GetTableName() + "  <--  " + GetTableType()
  Wend
  Debug "" : Debug ""
EndIf

result = RemoveDSN(dbName); DSN wieder entfernen
If Result = 0
  MessageRequester("SQLError", GetSQLInstallerError())
EndIf
Zuletzt geändert von mk-soft am 04.11.2007 16:43, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

mk-soft hat geschrieben:da ts-soft zur Zeit nicht zur Verfügung steht, führe ich das Projekt weiter.
Super! Danke für Dein Engagement! :allright:

Werde ich heute abend sofort mal in mein Projekt includen und
dann Bericht erstatten.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hinweis:

Die LIB funktioniert noch nicht stabile unter PB v4.10b3.
ExamineTable() kann unter v4.10 leider nicht verwendet werden.

Aber es wird daran gearbeitet.

FF :wink:

P.S. Bugfix 31.08.2007: Zu langer DSN Name.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

UPDATE

LIB läuft nun auch unter PB v4.10b3

Dazu läuft jetzt "ExamineTables(dsn [, user, pass]) mit geänderten Parameter.

Beispiel mit MySQL

Code: Alles auswählen

Define.s dbName = "information_schema.mysql" ; MySQL Schema
Define.s dsn =  AddDSN(dbName) ; DSN hinzufügen
Debug "DSN: " + dsn

If ExamineTables(dsn, "root", "admin")
  Debug "Tabellen in Database:"
  Debug ""
  While NextTable()
    Debug GetTableName() + "  <--  " + GetTableType()
  Wend
  Debug "" : Debug ""
EndIf
  
RemoveDSN(dbName)
Beispiel mit Access

Code: Alles auswählen

; Original by PAMKKKKK
; angepaßt für PBOSL_ExDatabase und PB4 by ts-soft und mk-soft

EnableExplicit

UseODBCDatabase()
;InitDatabase()

Define.s dbName = "c:\exDatabase_test.mdb" ; könnt Ihr anpassen
Define.s DSN
Define.s SQL
Define.l db = 0

If CreateEmptyMDB(dbName) ; leere Datenbank erstellen
  dsn = AddDSN(dbName) ; DSN hinzufügen
EndIf
Debug "DSM=" + dsn
; Datenbank verbinden
If OpenDatabase(db, DSN, "", "") = 0
  End
EndIf

If IsDatabase(db)
  Debug "Start..."
  ; SQL Befehl zum Tabelle erstellen
  SQL = "Create table Adress (id autoincrement, vorname text(50), nachname text(50), constraint Adress unique(id));"
  If DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    ; SQL Befehl zum einfügen von Daten in die Tabelle
    SQL = "Insert into Adress (vorname, nachname) values ('Thomas', 'Schulz')"
    DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    SQL = "Insert into Adress (vorname, nachname) values ('Max' ,'Mustermann')"
    DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    SQL = "Insert into Adress (vorname, nachname) values ('Erika', 'Mustermann')"
    DatabaseQuery(db, SQL) ; SQL Befehl ausführen
  Else
    Debug DatabaseError()
  EndIf
  
  ; SQL Befehl zum Auslesen von Daten der Tabelle
  SQL = "Select * from Adress order by nachname asc;"
  If DatabaseQuery(db, SQL) ; SQL Befehl ausführen
    Debug "Daten in Tabelle 'Adress'" : Debug ""
    While NextDatabaseRow(db) ; gelesene Daten aus der Datenbank durchlaufen
      Debug Str(GetDatabaseLong(db, 0)) + ": " + GetDatabaseString(db, 1) + " " + GetDatabaseString(db, 2) ; gelesene Daten aus der Datenbank ausgeben
    Wend
  EndIf
  CloseDatabase(db)
EndIf

; Tabellen lesen
If ExamineTables(dsn)
  Debug "Tabellen in Database:"
  Debug ""
  While NextTable()
    Debug GetTableName() + "  <--  " + GetTableType()
  Wend
  Debug "" : Debug ""
EndIf

RemoveDSN(dbName); DSN wieder entfernen
Bitte weiter Testen

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

UPDATE

- Unicode LIB -> kopieren nach "..\PureBasic\SubSystems\UserLibUnicode\PureLibraries"

- AddSystemDSN(...) und RemoveSystemDSN(...) hinzugefügt.

Wer es noch nicht weiß (wie ich vorher):
Zum compilieren mit Unicode in Compiler Option "Library Subsystem" - "userlibunicode" eintragen.

Wenn alles läuft landet es bald in der PBOSL.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Hi mk-soft,

gibt es schon eine neue ExDatabase Library Version mit Hilfetext?

Ich selber benutze relativ häufig die Datenbankfunktionen. Da aber meine auszulesenden Dateien immer unterschiedliche Tabellennamen benutzen, habe ich bisher immer die GetTables Funktion benutzt. Seit 4.10 beta 3 funktioniert diese aber nicht mehr (Update raufgespielt und dann furchtbar geärgert). Daher verwende ich jetzt die ExDatabase Library. Ich wüsste aber zu gerne wir Du die Tabellennamen ausließt, oder noch genauer wie muss ich die GetTables Funktion anpassen damit diese Funktion wieder funktioniert?

Aus Verzweiflung hatte ich schon GetWorksheetNamesVbs(ExcelFile.s) aus einem Script Beispiel genommen und sogar die alte Database lib aus der 4.10 beta 2 zurückkopiert...

Gruß Michael

Code: Alles auswählen

Procedure.s GetTables(Datenbank)

  Protected hwnd.l, r1.l, len.l 
  Protected *buffer 
  Protected result.s 
  
  hwnd = PeekL(IsDatabase(Datenbank) + 4) 
  result.s = "" 
  If hwnd 
    r1 = SQLTables_(hwnd,0,0,0,0,0,0,0,0) & $FFFF 
    If r1 = 0 Or r1 = 1 
      *buffer = AllocateMemory(256) 
      SQLBindCol_(hwnd,3,1,*buffer,256,@len) 
      While SQLFetch_(hwnd) & $FFFF = 0
        AddElement(Tabelle())
        result = RemoveString(PeekS(*buffer, len), "'")
        Tabelle()\Tabellenname.s = Left(result,Len(result)-1)
        Tabelle()\Suchstring.s="Select * From ["+PeekS(*buffer, len)+"]"
      Wend
      FreeMemory(*buffer) 
    EndIf 
  EndIf
  ;result = RemoveString(result, "'") 
  ProcedureReturn result 
  
EndProcedure

Code: Alles auswählen

Procedure.s GetWorksheetNamesVbs(ExcelFile.s) 
  
   Protected VBS$ 
  
   VBS$ + #CRLF$ 
   VBS$ + "Set xlApp = CreateObject(" + Chr(34) + "Excel.Application" + Chr(34) + ")" + #CRLF$ 
   VBS$ + "xlApp.Visible = False" + #CRLF$ 
   VBS$ + "xlApp.Workbooks.Open " + Chr(34) + ExcelFile.s + Chr(34) + #CRLF$ 
   VBS$ + #CRLF$ 
   VBS$ + "For Each wS In xlApp.Worksheets" + #CRLF$ 
   VBS$ + "   strWorksheets = strWorksheets & wS.Name & " + Chr(34) + ";" + Chr(34) + #CRLF$ 
   VBS$ + "Next" + #CRLF$ 
   VBS$ + "If Right(strWorksheets, 1) = " + Chr(34) + ";" + Chr(34) + " Then " + #CRLF$ 
   VBS$ + "  strWorkSheets = Left(strWorkSheets, Len(strWorkSheets) - 1)" + #CRLF$ 
   VBS$ + "End If" + #CRLF$ 
   VBS$ + #CRLF$ 
   VBS$ + "xlApp.Workbooks.Close" + #CRLF$ 
  
   ProcedureReturn VBS$ 
  
EndProcedure 
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Sooo,

jetzt habe ich eine Lösung gefunden, nachdem ich im englischen Forum gespickt habe.

Gruß,
Michael

Code: Alles auswählen


; ab Purebasic 4.10 b3

Structure Tabelle
    Tabellenname.s
    Suchstring.s
EndStructure

Global NewList Tabelle.Tabelle ()

;.......

Procedure.s GetTables(Database)
  SQLCancel_(PeekL(PeekL(IsDatabase(Database)+4)+4)) 
  res.w=SQLTables_(PeekL(PeekL(IsDatabase(Database)+4)+4),0,"%",0,0,0,0,0,0) 
  If res = 0 Or res = 1 ; #SQL_SUCCESS / #SQL_SUCCESS_WITH_INFO 
    While NextDatabaseRow(Database) 
      AddElement(Tabelle())
      result.s = GetDatabaseString(Database,2) 
      Debug result.s
      Tabelle()\Tabellenname.s = result.s
      Tabelle()\Suchstring.s="Select * From ["+result.s+"]"
    Wend 
  EndIf 
EndProcedure

Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hi,
leider habe ich es noch nicht geschaft die Hilfe zusammen zu schreiben. Ausserdem ist der Test mit PB 4.1x Beta 4 noch nicht abgeschlossen.
Daher habe ich den Code noch nicht hoch geladen.

Zur Erleuterung zu ExamineTables:
Um die Tabellen aus zu lesen verwende ich eine eigene SQlConnection. Es ist daher auch keine Database Library von PB erforderlich.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten