| |
|
|
- Seite 1 - |
|
Dietmar Horn | Hallo zusammen,
heute wende ich mich mal mit einem SQL-Problem zwecks Bitte um Hilfestellung an die SQL-Experten unter euch.
Ich arbeite z.Z. mit XProfan 11 an einem komplexeren Projekt. Es ist schon recht weit gediehen. Der bisher einzigste, aber entscheidende Problempunkt ist für mich die An- bzw. Einbindung des RDBS Firebird (Freeware bzw. Open-Source) bzw. Interbase (das kostenpflichtige Gegenstück von Borland zu Firebird - ähnlich wie das Verhältnis zwischen MS Office und Open-Office).
Bisher mußte ich mich noch nie groß mit SQL beschäftigen, außer daß ich mir immer mal die XProfan-Hilfe zum SQL-Thema reingezogen und das alles als recht logisch empfunden hatte. Doch wie des öfteren, liegt der Hund bestimmt nur in einem winzigen Detail begraben, was ich nicht kenne, oder in einem Fehler, den ich gemacht oder übersehen habe.
Firebird und Interbase kannte ich bis vor 4 Wochen noch nicht mal vom Namen her, weil ich sowas noch nie benötigt hatte - aber nun ist es soweit.
ODBC-Treiber und Firebird sind installiert.
Zunächst geht es darum, eine Verbindung herzustellen. Unter Windows 2000 (in unserem Vereins-Kabinett) klappt die Initialisierung mit SQLInit inzwischen.
Die Initialisierung liefert unter W 2000 wie gewünscht das Handle zurück:
Unter Windows XP ergibt das jedoch bis jetzt immer 0 (also gescheitert), und im Gegensatz zu W 2000 erscheint da vorher noch nicht mal der Dialog zum Eingeben von Username, PWD, usw.
Bevor dieses Problem mit dem Herstellen der Verbindung nicht gelöst ist, brauche ich gar nicht groß weitermachen.
Literatur über Firebird habe ich inzwischen tonnenweise, doch bevor ich es nicht schaffe, auf allen Windows-Systemen ab 2000 aufwärts eine zuverlässige Verbindung herzustellen, nützt mir das alles leider nicht allzu viel.
Kann mir vielleicht jemand weiterhelfen, der sich schon mal etwas näher damit beschäftigt hat?
Die nächsten Schritte, also das Neuanlegen einer Datenbank, oder das Bearbeiten / Auslesen einer vorhandenen DB und das Weiterverarbeiten der Daten im eigentlichen Programm dürfte dann lediglich noch einer reine Fleiß- und Logik-Arbeit sein.
Das Ausweichen z.B. auf dBase ist nicht möglich, weil dBase dbzgl. nicht über die für dieses Projekt erforderlichen Feautures verfügt.
Wer kann evtl. weiterhelfen?
Ich vermute mal, wenn das Programm irgendwann mit Firebird läuft, dann müßte das Programm auch mit Interbase funktionieren - oder?
Gruß und Danke im voraus Dietmar |
|
|
| Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 11.01.2009 ▲ |
|
|
|
| |
|
- Seite 6 - |
|
|
RGH | Uwe Pascal Niemeier
@ Roland: Wann wird es einen entsprechenden Patch geben? Es hat sich ja doch einiges angesammelt, was korrigiert werden müßte...
SeeYou Pascal
Huch, was denn alles? Mir fällt da noch der erst nach über einem Jahr entdeckte Bug bei REPEAT ... UNTIL ein. Aber eswird sicher um Ostern noch ein Bugfix (11.1a) oder Update (11.2) geben. Vielleicht habe ich ja noch eine Idee zum BLOB-Schreiben ...
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.03.2009 ▲ |
|
|
|
|
Uwe ''Pascal'' Niemeier | Hi Roland!
Roland
Huch, was denn alles?
Ich dachte da an die Sache mit StringW , die Unregelmäßigkeit bei Pointern als Parameter oder die Probleme mit Memory-DCs bei Startpaint ...(also im Prinzip alles schon erledigt) Das mit Repeat...Until ist mir eigentlich egal Und die BLOBs werden ja durch die 64KB-Grenze des Treibers versaut
SeeYou Pascal (Der für ein geplantes Projekt weder auf XProfan 11 noch auf ocx verzichten will) |
|
|
| |
|
|
|
| Uwe Pascal Niemeier
(Der ... weder auf XProfan 11 noch auf ocx verzichten will)
< -- des auch gern hätt |
|
|
| |
|
|
|
Dietmar Horn |
Und die BLOBs werden ja durch die 64KB-Grenze des Treibers versaut
Das kann so nicht stimmen, denn andere Konkurrenzprodukte zu meinem bzw. unserem aktuellen Projekt arbeiten mit echten Blobs in Interbase und Firebird (jedoch in C und Delphi programmiert). Nur mit XProfan scheint das bis jetzt leider eben noch nicht zu klappen.
Auch der EMS-SQL-Manager kann echte Blob-Felder anlegen - also muß das ja irgendwie gehen. Mit irgendeiner 32- oder 64-KB-Grenze irgendeines ODBC-Treibers dürfte das nichts zu tun haben, denn theoretisch können in solchen Blob-Feldern beliebige Binär-Daten notfalls mit hunderten GB Größe gespeichert werden. Natürlich nicht direkt im Blob-Feld, denn da wird vermutlich nur ein Verweis darauf stehen, wo genau in der DB die zugehörigen Daten abgespeichert bzw. zu finden sind. Doch um diese Verwalterei kümmert sich die IB-/FB-DB intern ja offensichtlich selber.
Wenn Roland das noch vernünftig hinbekommt, dann wäre dem Erstellen von riesigen Datenbankanwendungen bis in den GB- bzw. TB-Bereich mit XProfan wahrscheinlich absolut keine Grenzen mehr gesetzt - zumal Firebird als relationales SQL-Datenbanksystem auch für gewerbliche Anwendungen kostenlos zur Verfügung steht und gerade im kommerziellen Bereich inzwischen bereits sehr weit verbreitet ist.
Gruß Dietmar |
|
|
| Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V. [...] Windows 95 bis Windows 7 Profan² 6.6 bis XProfan X2 mit XPSE Das große XProfan-Lehrbuch: [...] | 01.03.2009 ▲ |
|
|
|
|
RGH | Uwe Pascal Niemeier
Ich dachte da an die Sache mit StringW , die Unregelmäßigkeit bei Pointern als Parameter oder die Probleme mit Memory-DCs bei Startpaint ...(also im Prinzip alles schon erledigt)
Oh, diese Kleinigkeiten habe ich schon erledigt und hatte sie wohl gedanklich bereits abgehakt.
Was ODBC und BLOB betrifft, so experimentiere ich noch etwas. Der oben von mir skizzierte Weg würde die 64k-Grenze für SQL-Statements umgehen. Aber dazu brauche ich noch etwas Zeit.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.03.2009 ▲ |
|
|
|
|
| Ähm.. fällt das mit dem Verschachteln von GOSUB´s auch unter Kleinigkeiten? Das würde mir nämlich die Umschreiberei von ca. 17 älteren Profanprogrammen ersparen. Bitte nicht vergessen! Gruß |
|
|
| |
|
|
|
RGH | Peter Specht
Ähm.. fällt das mit dem Verschachteln von GOSUB´s auch unter Kleinigkeiten? Das würde mir nämlich die Umschreiberei von ca. 17 älteren Profanprogrammen ersparen. Bitte nicht vergessen! Gruß
Ja, das ist auch schon erledigt (bei mir zumindest). (Und das, obohl es GOSUB ja offiziell schon lange nicht mehr gibt und nur noch eine undokumentierte Geschichte ist, die aus Kompatibilitätsgründen weiter existiert.)
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.03.2009 ▲ |
|
|
|
|
| Superst! Basic-Ähnlichkeit gerettet. Vielen Dank im voraus! Gruß |
|
|
| |
|
|
|
RGH | Dietmar Horn
Dietmar HornUnd die BLOBs werden ja durch die 64KB-Grenze des Treibers versaut Das kann so nicht stimmen, denn andere Konkurrenzprodukte zu meinem bzw. unserem aktuellen Projekt arbeiten mit echten Blobs in Interbase und Firebird (jedoch in C und Delphi programmiert). Nur mit XProfan scheint das bis jetzt leider eben noch nicht zu klappen.
Diese anderen Programme kommunizieren unter Umständen (mit ziemlicher Sicherheit) nicht per ODBC mit Firebird/Interbase, sondern direkt. Da sind natürlich ganz andere Sachen möglich. XProfan kommuniziert nur über ODBC mit allen Datenbanken, die eine solche Schnittstelle bieten. Und auch hier bietet XProfan (zumindest nicht ohne API) nicht alle Möglichkeiten, sondern nur die Kommunikation über SQL per SQLExec (dem die ODBC-API SQLExelDirect entspricht). Und für SQL-Statementsgibt es bei Firebird/Interbase eben die Begrenzung auf 64 kB. Pascal hat ja schon gezeigt, wie man die ODBC-API nutzen kann und ich hatte weiter oben ja aich schon die APIs erwähnt, mit denen es vermutlich möglich ist, BLOBs unter Umgehung der 64k-Grenze zu befüllen. Wenn ich Zeit finde, werde ich mir das mal anschauen.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.03.2009 ▲ |
|
|
|
|
RGH | Uwe Pascal Niemeier
Hi Leute! Mutmaßung: Entweder ist die db-Unterstützungvon Delphi völlig anders gestrickt als die von Profan
Korekt! Delphi kann über bestimmte Komponenten direkt mit Interbase kommunizieren und geht dabei nicht über ODBC.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.03.2009 ▲ |
|
|
|
|
Uwe ''Pascal'' Niemeier | Hi Dietmar!
Das kann so nicht stimmen, denn andere Konkurrenzprodukte zu meinem bzw. unserem aktuellen Projekt arbeiten mit echten Blobs in Interbase und Firebird (jedoch in C und Delphi programmiert). Nur mit XProfan scheint das bis jetzt leider eben noch nicht zu klappen.
Ich erinnere nochmal an den vorgeschlagenen Workaround, bei dem die Daten in mehreren Häppchen in dasselbe Datenfeld geschrieben werden. Das Ergebnis ist definitiv ein echter BLOB!
Mit irgendeiner 32- oder 64-KB-Grenze irgendeines ODBC-Treibers dürfte das nichts zu tun haben,...
Roland erwähnte ja, das dies sogar in irgendeiner Doku erwähnt wird. Das die Leute von FireBird ihre Treiber als Stiefkinder ansehen ist nicht Profans Schuld
Auch der EMS-SQL-Manager kann echte Blob-Felder anlegen
Da könnte man ja mal schauen, wie er das macht... Aber da Roland ja sowieso schon damit zugange ist, lohnt es sich wohl nicht, weil das Ergebnis schon mit der nächsten Profan-Version obsolete wäre.
SeeYou Pascal |
|
|
| |
|
|
|
RGH | Und es geht doch: Echte Binäre BLOBs mit XProfan
Bevor ich mein obiges Beispielprogramm auf echte BLOBs umschreibe, hierzunächst die Lösung per ODBC-API: KompilierenMarkierenSeparierenwindow 50,50-500,500
DEF &SQL_PARAM_INPUT 1
DEF &SQL_SUCCESS 0
DEF &SQL_HANDLE_STMT 3
DEF &SQL_C_DEFAULT 99
DEF &SQL_CHAR 1
DEF &SQL_NUMERIC 2
DEF &SQL_DECIMAL 3
DEF &SQL_INTEGER 4
DEF &SQL_SMALLINT 5
DEF &SQL_FLOAT 6
DEF &SQL_REAL 7
DEF &SQL_DOUBLE 8
DEF &SQL_VARCHAR 12
DEF &SQL_DATE 9
DEF &SQL_TIME 10
DEF &SQL_TIMESTAMP 11
DEF &SQL_LONGVARCHAR -1
DEF &SQL_BINARY -2
DEF &SQL_VARBINARY -3
DEF &SQL_LONGVARBINARY -4
DEF &SQL_BIGINT -5
DEF &SQL_TINYINT -6
DEF &SQL_BIT -7
def SQLAllocHandle(3) !odbc32,SQLAllocHandle
def SQLFreeHandle(2) !odbc32,SQLFreeHandle
def SQLPrepare(3) !odbc32,SQLPrepare
def SQLBindParameter(10) !odbc32,SQLBindParameter
def SQLExecute(1) !odbc32,SQLExecute
proc SQLPutBlob
parameters Exec$, DATA#
declare stmt&, size&, ret%, error$
SQLAllocHandle(&SQL_HANDLE_STMT, &SQLDBC, addr(stmt&))
size& = SizeOf(Data#)
Ret% = SQLBindParameter(stmt&, 1, &SQL_PARAM_INPUT, &SQL_BINARY, &SQL_LONGVARBINARY,
SizeOf(Data#), 0, Data#, 0, Addr(size&))
If LoWord(Ret%) = &SQL_SUCCESS
Ret% = SQLPrepare(stmt&,addr(Exec$),len(Exec$))
If LoWord(Ret%) = &SQL_SUCCESS
Ret% = SQLExecute(stmt&)
Case LoWord(Ret%) <> &SQL_SUCCESS : Error$ = SQLExecute
Else
error$ = SQLPrepare
EndIf
Else
error$ = SQLBindParameter
EndIf
Case Len(error$) : MessageBox(error$ + fehlgeschlagen!, ODBC-Fehler, 16)
SQLFreeHandle(&SQL_HANDLE_STMT, stmt&)
endproc
Declare Bild#
CLS
Var datei$ = HELLOWEEN.JPG
Dim Bild#, FileSize(datei$)
BlockRead(datei$, Bild#, 0, FileSize(datei$))
var db& = sqlinit(DSN=KursDB;UID=SYSDBA;PWD=masterkey;DBNAME=D:\Dokumente\FireBird\KURSDB.GDB)
SQLPutBlob(INSERT INTO TCS (Feld1) VALUES (?), Bild#)
SQLDone
Print Blob geschrieben!
waitinput
end
Das Ergebnis kann man mit dem SQL-Manager begutachten und z.B. den geschriebenen BLOB als Datei speichern und diese dann mit einem Bildbearbeitungsprogramm betrachten. BTW: Helloween.jpg ist ca. 1,5 MB groß.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 02.03.2009 ▲ |
|
|
|