Verhalten des gleichen Source Codes auf Windows/Linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von Jörg Burdorf »

Datenbank ist DB2 von IBM. Das Programm nimmt durch den Benutzer angegebene
SQL Befehle entgegen und führt sie aus. Sobald der SQL an die DB übergeben ist, wartet
das Programm auf das Ergebnis. Die Länge der Laufzeit und die Menge der Daten hängt von der
Abfrage ab, die der User stellt. Da ich keine Eieruhr gefunden hab, habe ich ein Textfeld für die
Information benutzen wollen, dass der SQL noch läuft. Im Prinzip den Wait Cursor emuliert.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von ccode_new »

Vielleicht hilft das!

http://www.purebasic.fr/german/viewtopi ... 21&t=30246

Hier einmal ein ganz einfaches schnell zusammengewurfenes Beispiel:

Code: Alles auswählen

Enumeration #PB_Event_FirstCustomValue
  #EventBeginProcessing
  #EventProcessingFinished
EndEnumeration

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
  Result = DatabaseUpdate(Database, Query$)
  If Result = 0
    Debug DatabaseError()
  EndIf
  
  ProcedureReturn Result
EndProcedure

Global count.i = 0

Procedure Thread(Value)
  PostEvent(#EventBeginProcessing)
  
  DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"
  
  If CreateFile(0, DatabaseFile$)
  CloseFile(0)
  
  If OpenDatabase(0, DatabaseFile$, "", "")
    
    CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")
    
    CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
    CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
    CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")
    If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 3")
      
      While NextDatabaseRow(0)
        Delay(1000)
        PostEvent(#PB_Event_Timer) ;Man sollte aber evtl. ein anderes Event nehmen ;)
        Debug GetDatabaseString(0, 0)
      Wend
      
      FinishDatabaseQuery(0)
    EndIf
    
    CloseDatabase(0)
  Else
    Debug "Can't open database !"
  EndIf
Else
  Debug "Can't create the database file !"
EndIf
  
  PostEvent(#EventProcessingFinished)
EndProcedure


OpenWindow(0, 200, 200, 100, 100, "PostEvent")

TextGadget(0, 10, 10, 120, 30, "0 %")

CreateThread(@Thread(), 0)

Repeat
  Event = WindowEvent()
  
  Select Event
    Case #PB_Event_Timer
      count + 1
      gcount = 100 / 3 * count
      SetGadgetText(0, Str(gcount)+"%")
    Case #EventBeginProcessing
      Debug "Thread begin processing "
      Check = #True
      
    Case #EventProcessingFinished
      Debug "Thread processing finished"
      SetGadgetText(0, "100%")
  EndSelect
  
Until Event = #PB_Event_CloseWindow
__________________________________________________
URL angepasst und SID entfernt
02.01.2019
RSBasic
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von Jörg Burdorf »

Hi Gemeinde!

Habe neue Erkenntnisse zum Thema Purebasic Windows/Linux mit ODBC und DB2.

Es gibt in Purebaisc die Möglichkeit, den Datenbank Datentypen zu cheken:

if DatabaseColumnType(0,i) = #PB_Database_String
oder
if DatabaseColumnType(0,i) = #PB_Database_Long

In DB2 gibt es den Datentypen CLOB (Character large Object), also ein langer String.

Wenn ich in Windows den Datentype abfrage, ergibt das #PB_Database_String, das ist so korrekt
wenn ich das in Linux mache, ergibt die gleiche Abfrage gegen die gleiche Datenbank
#PB_Database_Long, das ist ein Bug, da ein numerischer Wert hier erwartet wird.
Da ich numerische Werte rechtsbündig im Listiconiew anzeigen will, wird der Wert
ans Ende der Spalte geschrieben. Da so ein CLOB bis zu 2MB groß sein kann, wird dieses
"rechtsbündig" eine ziemlich große Spalte. So bei 1000 Zeilen dauert das dann eine Weile, bis das Programm
zurückkommt. Danach ist auch ein scrollen im Listiconview nicht wirklich performant.

Jetzt kann ich natürlich unter Linux (MAC OS hab ich noch nicht probiert) immer eine String nehmen, was die
Ausgabe aber nicht wirklich hübsch macht.

Hab das Problem auch im englischen Forum gepostet. Mal sehen, ob mir da jemand helfen kann.

Hier der Link zum englischen Forum:
https://www.purebasic.fr/english/viewto ... =4&t=71932

Jörg
Jörg Burdorf
Beiträge: 23
Registriert: 14.12.2018 23:01

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von Jörg Burdorf »

Noch ein Update:

Auch BLOB Felder (binary large objects) werden unter Linux als #PB_Database_Long erkannt!!!
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Verhalten des gleichen Source Codes auf Windows/Linux

Beitrag von ccode_new »

Hallo Jörg Burdorf,

ich wünsche mir das es hier, bzw. im englischen Forum jemand gibt der dir weiterhelfen kann.

Ich bin leider bei den Datanbanksachen zu inkompetent.

Ich kann dir nur sagen das ein Blob/LongBlob bei SQLLite auch als solchen gewertet wird.

Aber bei ODBC ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten