Seite 2 von 7

Verfasst: 28.08.2007 09:24
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

Verfasst: 28.08.2007 11:09
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.

Verfasst: 30.08.2007 14:14
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

Verfasst: 30.08.2007 14:36
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

Verfasst: 30.08.2007 18:15
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.

Verfasst: 01.09.2007 17:11
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:

Verfasst: 03.09.2007 20:50
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:

Verfasst: 01.11.2007 00:49
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 

Verfasst: 01.11.2007 18:03
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


Verfasst: 02.11.2007 21:03
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: