Foro | | | | Dietmar Horn | ¡Hola zusammen,
con mi XProfan-Firebird-SQL-Projekt klappt lo soweit bastante bien.
Nun hay aber una Problema, welches Yo möglichst a vorgestern con XProfan lösen müßte, si el con XProfan aktuell überhaupt posible es.
In el ersten offiziellen Beta para ausgesuchte Tester se el Programa nun necesariamente como Embedded-Variante laufen, y no como No-Embedded.
Mit No-Embedded encima ODBC-Schnittstelle mittels el normalen FB-SQL-Befehle klappt bisher alles weitestgehend tadellos.
Doch como kann Yo el Embedded-Variante inicializar, en danach con denselben SQL-Routinen en el Programa como gewohnt weiterarbeiten a puede? Später se el Anwender entonces zwischen beiden Varianten selber el Auswahl treffen.
Für el SQL-Experten bajo euch Yo ya veces alles en una ZIP-Archiv gepackt - also Firbird embedded (no Installation erforderlich) y algunos zusätzliche Hilfedateien (außer el, welche en el Unterordner doc sowieso ya disponible son). El beigelegte Patienten.fdb podría para Testen dienen.
Selber Yo el pocos laut Hilfedatei(en) benötigten Archivos en el Projektverzeichnis kopiert y el fbembed.dll en fbclient.dll umbenannt. Laut Hilfedatei(en) debería el ausreichen. Como Yo el a ahora verstehe, braucht uno doch el Rest de el Firebird-Ordner de el ZIP doch nada necesariamente, oder?
Doch con KompilierenMarcaSeparación bekomme Yo simplemente no Verbindung hin!
Wenn Yo el en el nächsten Tagen (notfalls eben sólo veces por Workarount) no irgendwie con XProfan hinbekomme, entonces kann Yo el Arbeit de más Monaten en el Principio en el Tonne kloppen ...
Roland, hast Usted tal vez como Datenbank-Profi una solución a dieses Problema, oder wer de los otro DB-Profis sabe se todavía así de?
Saludo y Gracias en el 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: [...] | 17.04.2009 ▲ |
| |
| | E.T. |
...El Datenbankdatei muss se en Benutzung des embedded Server neben diesem ebenfalls en el Applikationsverzeichnis befinden. ...
Ist me beim lesen el Anleitung siempre otra vez aufgefallen. Meist mentira el DB sí en un otro Directorio...
[offtopic]...sólo así como Gedanke... [/offtopic] |
| | | Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 17.04.2009 ▲ |
| |
| | Dietmar Horn | Nein, Mario,
el pocos DLL puede en el selben Directorio mentira, como DB, anderenfalls voluntad ellos de el (umbenannten) fbclient.dll en el Windows-, Windows-Sistema- oder Windows-Sistema32-Directorio gesucht. Das haben wir alles stundenlang vergeblich durchprobiert (ähnlich como damals el Sache con el BLOBs). Mit ImportDLL(fbclient.dll,*) puede ser se genau ansehen, wo el fbclient.dll el otro pocos DLL con el restlichen Características sucht. Notfalls puede ser sí con ChDir en el Ordner wechseln, en el se esta pocos Archivos tummeln.
Und laut el vielen FB-Hilfedateien stellt en el Embedded-Versión el fbclient.dll para el DBMS el real Server dar, el todos FB-Funktionalitäten lokal disponible stellt - aber en el Gegensatz a Nichtembedded-Versión muß el Anwender como no sólo cada todavía así pequeño DB-Programa en el Systemsteuerung el ODBC-Treiber konfigurieren.
Meiner Meinung después de fehlt como (o. me) a ahora sólo todavía el allererste Baustein, en esta Server (Así que el Embedded-FBClient.dll) a inicializar.
Yo vermute o. befürchte bald, daß el a ahora con XProfans SQLInit no así sin weiteres posible ser se. Yo schätze veces, hier se wahrscheinlich sólo Roland selber zeitnah weiterhelfen puede - ähnlich como en BLOB-Geschichte - oder uno de los otro API-Spezialisten, que ahora ya genauer con el FB-APIs auskennen, sin se selber sólo mühsam herantasten tener ... Notfalls eben una neue, todavía con C++ oder Delphi a erstellende FB-Embedded-DLL para XProfan. Mi nächste Befürchtung va dahin, daß SQL-Exec ebenfalls el installierten ODBC-Treiber voraussetzt y al todo SQL-Zeugs con SQLExec entonces ebenfalls api-mäßig selber nachbasteln müßte. Hoffentlich Yo con media Berfürchtungen no bastante, porque entonces wäre sin Rolands rasche Ayuda mein aktuelles ya bastante weit fortgeschrittenes Projekt sólo de esta Gründen para Scheitern verurteilt y monatelange Programmierarbeit para el Katz gewesen.
Yo sería mich sin embargo riesig darüber freuen, si yo en esta Punkten Denkfehler begehe y yo veces otra vez sólo el Wald antes lauter Bäumen no sehe. Doch como en el Ausgangsposting ya dijo: El Tiempo hängt me wegen dieser Geschichte inzwischen bastante schön en el Nacken.
Saludo 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: [...] | 18.04.2009 ▲ |
| |
| | RGH | ¡Hola,
auch si yo heute no Tiempo habe, una erster Referencia: Ohne ODBC-Treiber se lo natürlich no ir: Ohne ODBC-Treiber kann el ODBC-Schnittstelle de XProfan natürlich no trabajo. Gibt lo una ODBC-Treiber para Firebird-Emedded? Oder lässt se el bisherige Treiber para Embedded konfigurieren?
Direkter Aufruf en API el DLL podría natürlich ir. Ist esta irgendwo dokumentiert? Vermutlich hay como una Documentación para Delphi oder C++ ... o schlimmsten Fall sólo fertige Komponenten sin Quellcode, el encima ihre Zugriffe nichts preis geben. (Aunque wären el reciente Überlegungen entonces tatsächlich bastante wertlos, como lo entonces sí en algo bastante Anderes va. Das hätte uno de Anfang a erwähnen necesario. Ok, el Oberfläche kann natürlich bleiben ...)
Saludo 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 | 19.04.2009 ▲ |
| |
| | | Tal vez veces el Florian Heuberger fragen si él con Visual-Zeugs en algo como Zugriff ha. |
| | | | |
| | Dietmar Horn | ¡Hola,
nein, el es sí el Sinn de FB-Embedded, daß uno como no ODBC-Treiber benötigt. Mehreren otro Programmen de dieser Branche hacer el genauso. Der Anwender kann optional umschalten, welchen Modus él nutzen möchte: Embedded (local, sin gleichzeitigen Mehrfachzugriff), oder No-Embedded (Mehrfachzugriff en DB encima Netzwerk posible).
An Dokumentationen Yo el, qué en FB sowieso esta es, el Yo con en el obige ZIP gepackt habe y todavía una API-Guide para Interbase (IB y FB debería wohl kompatibel ser) - siehe Anhang. Für mich una Buch con sieben Siegeln!
Aunque wären el reciente Überlegungen entonces tatsächlich bastante wertlos, como lo entonces sí en algo bastante Anderes va.
Wertlos no, porque Yo necesidad zwingend beide Modi. Nur dumm, daß el Projektleiter el Beta-Versión ausgewählten Testern nun vorerst como Embedded geben möchte (porque esta a 99% no en el Lage son, el ODBC-Geschichte selber einzurichten).
Den normalen Modus Yo fertig, como funktioniert dbzgl. con XProfan a ahora alles bestens.
Saludo 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: [...] | 19.04.2009 ▲ |
| |
| | RGH | ¡Hola,
como dijo, para el en XProfan integrierten ODBC-Características es una ODBC-Treiber zwingende Vorraussetzung. Dieses Umschalten en Embedded sin ODBC funktioniert also sólo para Anwendungen, el generisch, also direkt por Firebird- o. Interbase-API, con el Datenbank kommunizieren. Für Delphi oder C++ voluntad vermutlich entsprechende Komponenten mitgeliefert. En esta Anwendungen se also de vornherein no Umweg encima ODBC gegangen. Der Zugriff en el Datenbank es Así que una bastante otro y como son el reciente Überlegungen para Guardar y Lesen de BLOBs encima ODBC tatsächlich kaum verwendbar.
Möglicherweise braucht uno pero no extra a schreibende DLL, pero kann el API direkt uso.
Saludo 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 | 19.04.2009 ▲ |
| |
| | RGH | ¡Hola, Yo veces a la kurzen Blick en el API-Guide geworfen. Como scheint sí alles drin a posición, qué braucht: isc_attach_database() para Öffnen el Datenbank, isc_dsql_exec_immediate() para Ausführen uno SQL-Statements, etc. El API erinnert una wenig a el ODBC-API. Yo schaue veces, dass Yo el nächsten Tage Tiempo finde, así una wenig a experimentieren. (Aber lo Yo hindere auch niemanden, lo incluso a probieren. El Beschreibungen scheinen me bastante ausführlich a ser.)
Saludo 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 | 19.04.2009 ▲ |
| |
| | Dietmar Horn | Hola Roland,
danke en el voraus para Su Mühe!
Wenn dieser Embedded-Modus irgendwie klappt, entonces bin Yo fix y fertig y voluntad determinado reif para el Klappse ser! Das wäre entonces tal vez aber auch no schlecht, porque hay hätte Yo vermutlich genügend Tiempo, mein XProfan-Lehrbuch en zwei weitere größere Kapitel a ergänzen:
XProfan y el relationalen Datenbanksysteme Firebird y Interbase
1. Mi armen Nerven y Firebird 2. Einführung en Firebird con XProfan
Weil Firebird sí libre a haben es, wäre el entonces una clevere No-ODBC-Alternative a el z.T. doch bastante eingeschränkten y el Jahre gekommenen dBase.
Saludo 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: [...] | 20.04.2009 ▲ |
| |
| | RGH | ¡Hola,
hier una erster Teil a Verwendung de direktem Zugriff en Firebird mittels XProfan. Das Ejemplo debería sowohl para el Client-Versión (como heißt el DLL allerdings anders: fbclient.dll, en Interbase natürlich auch) como auch como hier para el Embedded-Versión trabajo.
ACHTUNG: Das Ejemplo funktioniert! Wenn uno con Sí antwortet se el Datenbank tatsächlich gelöscht y beim Intento, el no mehr vorhandene Datenbank a schließen, hay el entsprechene Firebird-Fehlermeldung. ALso vorher Por favor, una Sicherheitskopie el Datenbankdatei (en el Ejemplo Patienten.fdb) redactar.
Was geschieht en el Programa? - Mit ImportDLL voluntad el API-Características el DLL imortiert - Mit isc_expand_dpb() se el Verbindungsstring producido. In unserem Fall brauchen wir sólo Username y Paßwort. El entsprechenden Konstanten kommen de el ibase.h - Mit isc_attach_database() se el Verbindung a Datenbank producido. Wenn el erste Eintrag des Status-Arrays una 1 es, es el zweite Eintrag en el Falle ungleich 0 el Interbase-Fehlernummer. In diesem Fall es con isc_interprete() el texto el entsprechenden Fehlermeldung ermittelt. - con isc_drop_database() puede wir nun el Datenbank löschen. Das klappt natürlich sólo korrektem Usernamen y Paßwort. Ansonsten hay una Fehlermeldung. (Das Löschen el Datenbank Yo como praktischen Test para el erfolgreiche Verbindung gewählt, porque una SELECT una wenig komplexer wäre ... ;) ) Mit algo Fleiß y Erfahrung puede ser natürlich con el übrigen API-Características auch SQL-Statements absetzen, BLOBs escribir y lesen, etc. El API erinnert una wenig a el ODBC-API ... desafortunadamente sólo una wenig. - Mit isc_detach_database() se el Verbindung a Datenbank final ... vorrausgesetzt ellos wurde en el vorigen Schritt no gelöscht.
Das Ejemplo beweist, qué aber eh klar war: Wenn con otro Programmiersprachen el direkte Zugriff en Firebird va, es auch con XProfan: KompilierenMarcaSeparaciónFireBird Embedded Demo
----------------------
©2009 Roland G. Hülsmann
Definitionen aus ibase.h
def &isc_dpb_user_name 28
def &isc_dpb_password 29
declare msg#
declare status_vector&[20]
declare pdpb&, pstatus&
var hdll& = ImportDLL(fbembed.dll, fb_)
dim msg#, 512
var dpb_length& = 0 Länge des Verbindungsstrings
var db1& = 0 Databasehandle
var user$ = SYSDBA
var pass$ = masterkey
var name$ = Patienten.fdb
cls
Verbindungsstring erstellen
fb_isc_expand_dpb(addr(pdpb&), addr(dpb_length&),
&isc_dpb_user_name, addr(user$),
&isc_dpb_password, addr(pass$),
0)
whileloop 0, dpb_length& - 1
print hex$(byte(pdpb&,&loop));,;
endwhile
Verbindung zur Datenbank herstellen und auf Fehler prüfen
fb_isc_attach_database(addr(status_vector&[0]), len(name$), addr(name$), addr(db1&), dpb_length&, pdpb&)
if ((status_vector&[0] = 1) and status_vector&[1])
pstatus& = addr(status_vector&[0])
fb_isc_interprete(msg#, addr(pstatus&))
messagebox(string$(msg#, 0), Firebird-Fehler, 16)
end 1
endif
Hier könnte nun der Zugriff auf die Datenbank stattfinden ...
Im Beispiel wird die Datenbank gelöscht! (Vor dem Ausprobieren bitte Sicherheitskopie anlegen!)
if messageBox(Wollen Sie die Datenbank wirklich löschen?, Frage:, 36) = 6
fb_isc_drop_database(addr(status_vector&[0]), addr(db1&))
if ((status_vector&[0] = 1) and status_vector&[1])
pstatus& = addr(status_vector&[0])
fb_isc_interprete(msg#, addr(pstatus&))
messagebox(string$(msg#, 0), Firebird-Fehler, 16)
end 2
endif
endif
Verbindung mit der Datenbank lösen und auf Fehler prüfen
fb_isc_detach_database(addr(status_vector&[0]), addr(db1&))
if ((status_vector&[0] = 1) and status_vector&[1])
pstatus& = addr(status_vector&[0])
fb_isc_interprete(msg#, addr(pstatus&))
messagebox(string$(msg#, 0), Firebird-Fehler, 16)
end 3
endif class=s4 href='./../../funktionsreferenzen/XProfan/end/'>end
Saludo 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 | 20.04.2009 ▲ |
| |
| | Dietmar Horn | Gracias!
Das SQLInit y SQLDone hätten wir entonces sí ya veces.
Wenn Yo entonces irgendwie el Äquivalent a SQLExec por API con el bastante normalen SQL-Übergabestrings (SELECT, INTO, UPDATE, etc.) hätte, entonces wäre el Kuh sí sólo veces fast vom Eis.
Saludo 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: [...] | 20.04.2009 ▲ |
| |
| | RGH | Dietmar Horn, Beitrag=51895, Zeitpunkt=20.04.2009
Gracias!
Das SQLInit y SQLDone hätten wir entonces sí ya veces.
Wenn Yo entonces irgendwie el Äquivalent a SQLExec por API con el bastante normalen SQL-Übergabestrings (SELECT, INTO, UPDATE, etc.) hätte, entonces wäre el Kuh sí sólo veces fast vom Eis.
Saludo Dietmar
Nun porque! Das meiste va ya. Aus Gründen, el me todavía no bekannt son, läßt se kein Feld con NUMERIC(10,2) definieren. NUMERIC(8,2) hingegen funktioniert. Und Felder, el con NUMERIC(10,2) definiert son, como z.B. SALARY en EMPLOYEES erzeugen beim Zugriff lediglich una Fehlermeldung. Und BLOBs hay auch todavía no, dürften aber kein großes Problema ser. KompilierenMarcaSeparaciónFireBird Embedded Demo
----------------------
©2009 Roland G. Hülsmann
Definitionen aus ibase.h
def &isc_dpb_user_name 28
def &isc_dpb_password 29
def &SQLDA_VERSION1 1
def &DSQL_close 1
def &DSQL_drop 2
def &SQL_TEXT 452
def &SQL_VARYING 448
def &SQL_SHORT 500
def &SQL_LONG 496
def &SQL_FLOAT 482
def &SQL_DOUBLE 480
def &SQL_D_FLOAT 530
def &SQL_TIMESTAMP 510
def &SQL_BLOB 520
def &SQL_ARRAY 540
def &SQL_QUAD 550
def &SQL_TYPE_TIME 560
def &SQL_TYPE_DATE 570
def &SQL_INT64 580
Weitere Definitionen
def &varchar $1C0 448 SQL_VARYING NOT NULL
def &varchar2 $1C1 449 NULL ALLOWED
def &char $1C4 452 SQL_TEXT NOT NULL
def &char2 $1C5 453 NULL ALLOWED
def &float $1E2 482 SQL_FLOAT NOT NULL
def &float2 $1E3 NULL ALLOWED
def &long $1F0 496 SQL_LONG NOT NULL
def &long2 $1F1 497 NULL ALLOWED
def &short $1F4 500 SQL_SHORT NOT NULL
def &short2 $1F5 501 NULL ALLOWED
def &date $1FE 510 SQL_TIMESTAMP N NULL
def &date2 $1FF 511 NULL ALLOWED
def &blob $208 520 SQL_BLOB NOT NULL
def &blob2 $209 521 NULL ALLOWED
Strukturen aus ibase.h
struct XSQLVAR =
sqltype%, 00:datatype of field
sqlscale%, 02:scale factor
sqlsubtype%, 04:datatype subtype - BLOBs & Text types only
sqllen%, 06:length of data area
sqldata&, 08:address of data
sqlind&, 12:address of indicator variable (short)
sqlname_length%, 16:length of sqlname field
sqlname$(31), 18:name of field, name length + space for NULL
relname_length%, 50:length of relation name
relname$(31), 52:fields relation name + space for NULL
ownname_length%, 84:length of owner name
ownname$(31), 86:relations owner name + space for NULL
aliasname_length%, 118:length of alias name
aliasname$(31) 120:relations alias name + space for NULL -> 151 = 152 Bytes
struct XSQLDA =
version%, 00:version of this XSQLDA
sqldaid#(14), 02:for future use
sqln%, 16:number of fields allocated
sqld% 18:actual number of fields
Weitere Strukturen
struct TIMEDATE =
sek&, 0 .. 59
min&, 0 .. 59
std&, 0 .. 23
tag&, 1 .. 31
mon&, 0 .. 11 !
jahr&, Jahr - 1900 (109 = 2009)
wtag&, Wochentag 0 .. 6, 0 = Sonntag
jtag&, Tag im Jahr 0 .. 365
isdst& Ungleich null bei US-Sommerzeitkonvertierung
Funktionen aus DLL importieren
var hdll& = ImportDLL(fbembed.dll, fb_)
proc fbError
parameters sv&[]
declare msg#
dim msg#, 512
var pstatus& = addr(sv&[0])
var sqlcode& = fb_isc_sqlcode(addr(sv&[0]))
if sqlcode& < 0 SQL-Fehlergefunden
fb_isc_sql_interprete(sqlcode&, msg#, 512)
else
fb_isc_interprete(msg#, addr(pstatus&))
endif
if get(errorlevel) > 0
messagebox(string$(msg#, 0), Firebird Fehler:, 16)
end 1
elseif get(errorlevel) = 0
messagebox(string$(msg#, 0), Firebird Warnung:, 16)
endif
endproc
proc fbInit
parameters user$, pass$, name$
declare status_vector&[20]
var dpb_length& = 0 Länge des Verbindungsstrings
var db1& = 0 Databasehandle
var pdpb& = 0 Zeiger auf Verbindungsstring
Verbindungsstring erstellen
fb_isc_expand_dpb(addr(pdpb&), addr(dpb_length&),
&isc_dpb_user_name, addr(user$),
&isc_dpb_password, addr(pass$),
0)
Verbindung zur Datenbank herstellen und auf Fehler prüfen
fb_isc_attach_database(addr(status_vector&[0]), len(name$), addr(name$), addr(db1&), dpb_length&, pdpb&)
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
return db1&
endproc
proc fbDone
parameters db1&
declare status_vector&[20]
Verbindung mit der Datenbank lösen und auf Fehler prüfen
fb_isc_detach_database(addr(status_vector&[0]), addr(db1&))
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
endproc
proc fbDrop
parameters db1&
declare status_vector&[20]
fb_isc_drop_database(addr(status_vector&[0]), addr(db1&))
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
endproc
proc pad
parameters s$, l&
return left$(s$ + space$(l&), l&)
endproc
proc fbSQLExec
parameters db1&, sql$, mode%
declare status_vector&[20], trans&, stmt&
declare osqlda#, osqlvar#, osql#, tm_date#
var sqlcount& = 0
dim osqlda#, XSQLDA
dim osqlvar#, XSQLVAR
dim tm_date#, TIMEDATE
Transaktion starten
fb_isc_start_transaction(addr(status_vector&[0]), addr(trans&), 1, addr(db1&), 0, 0)
if trans& > 0
Statementhandle holen
if left$(upper$(trim$(sql$)),7) <> SELECT
fb_isc_dsql_execute_immediate(addr(status_vector&[0]), addr(db1&), addr(trans&), len(sql$), addr(sql$), 1, 0)
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
else
fb_isc_dsql_allocate_statement(addr(status_vector&[0]), addr(db1&), addr(stmt&))
if stmt& > 0
Datenbereich zunächst für das Lesen der ersten 2 Felder vorbereiten
dim osql#, sizeof(osqlda#) + 2 * sizeof(osqlvar#)
clear osql#
osqlda# = addr(osql#)
osqlda#.version% = &SQLDA_VERSION1
osqlda#.sqln% = 2
Informationen über erste 2 Felder holen (Datentyp, Länge, etc.)
fb_isc_dsql_prepare(addr(status_vector&[0]), addr(trans&), addr(stmt&), len(sql$), addr(sql$), 1, osql#)
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
var d% = osqlda#.sqld%
if d% > 2
Wenn mehr als zwei Felder, dann Datenbereich für erittelte Feldanzahl neu dimensionieren
clear osql#
dim osql#, sizeof(osqlda#) + d% * sizeof(osqlvar#)
osqlda# = addr(osql#)
osqlda#.version% = &SQLDA_VERSION1
osqlda#.sqln% = d%
Informationen über alle Felder holen (Datentyp, Länge, etc.)
fb_isc_dsql_prepare(addr(status_vector&[0]), addr(trans&), addr(stmt&), len(sql$), addr(sql$), 1, osql#)
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
endif
Feldbeschreibungen füllen und Titelzeile erzteugen
declare fname$[d%-1], ftyp%[d%-1], fstyp%[d%-1], flen%[d%-1], fscale%[d%-1], fdata$[d%-1]
var zeile$ =
var maxlen& = 0
whileloop 0, d%-1
osqlvar# = addr(osql#) + sizeof(osqlda#) + &loop * sizeof(osqlvar#)
fname$[&loop] = osqlvar#.sqlname$
flen%[&loop] = osqlvar#.sqllen%
case len(fname$[&loop]) > flen%[&loop] : flen%[&loop] = len(fname$[&loop])
ftyp%[&loop] = osqlvar#.sqltype%
fstyp%[&loop] = osqlvar#.sqlsubtype%
case ftyp%[&loop] = &date : flen%[&loop] = 10
case ftyp%[&loop] = &date2 : flen%[&loop] = 10
fscale%[&loop] = osqlvar#.sqlscale%
print osqlvar#.sqltype%, hex$(ftyp%[&loop]),fstyp%[&loop],fname$[&loop],flen%[&loop]
zeile$ = zeile$ + pad(fname$[&loop],flen%[&loop]) + |
case flen%[&loop] > maxlen& : maxlen& = flen%[&loop]
endwhile
Titelzeile ausgeben
select mode%
caseof 0 : print zeile$
caseof 1 : addstring zeile$
endselect
Trennlinie erzeugen und ausgeben
zeile$ =
whileloop 0, d%-1
zeile$ = zeile$ + mkstr$(-,flen%[&loop]) + |
endwhile
select mode%
caseof 0 : print zeile$
caseof 1 : addstring zeile$
endselect
Statement ausführen
fb_isc_dsql_execute(addr(status_vector&[0]), addr(trans&), addr(stmt&), 1, 0)
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
Datenbereich für Empfang eines Satzes vorbereiten
osqlda#.sqln% = d% * 256
declare data#[d%-1]
declare ind&[d%-1]
dim data#[], maxlen& + 1
whileloop 0, d% - 1
long osql#, sizeof(osqlda#) + &loop * sizeof(osqlvar#) + 8 = addr(data#[&loop])
long osql#, sizeof(osqlda#) + &loop * sizeof(osqlvar#) + 12 = addr(ind&[&loop])
endwhile
Daten satzweise holen und auswerten
var retcode& = 0
retcode& = fb_isc_dsql_fetch(addr(status_vector&[0]), addr(stmt&), 1, osql#)
while retcode& <> 100 100: keine weiteren Sätze
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
zeile$ =
whileloop 0, d%-1
select ftyp%[&loop]
caseof &varchar, &varchar2
fdata$[&loop] = string$(data#[&loop],2)
caseof &date, &date2
fb_isc_decode_sql_date(data#[&loop],tm_date#)
fdata$[&loop] = dtoc$(format$(%.4d, tm_date#.jahr& + 1900)
+ format$(%.2u, tm_date#.mon& + 1)
+ format$(%.2u, tm_date#.tag&))
caseof &char, &char2
fdata$[&loop] = string$(data#[&loop],0)
caseof &long, &long2, &short, &short2
fdata$[&loop] = str$(long(data#[&loop],0))
caseof &float, &float2
fdata$[&loop] = str$(double(long(data#[&loop],0)))
caseof &blob, &blob2
fdata$[&loop] = BLOB- + str$(fstyp%[&loop])
endselect
zeile$ = zeile$ + pad(fdata$[&loop],flen%[&loop]) + |
endwhile
inc sqlcount&
Datenzeile ausgeben
select mode%
caseof 0 : print zeile$
caseof 1 : addstring zeile$
endselect
retcode& = fb_isc_dsql_fetch(addr(status_vector&[0]), addr(stmt&), 1, osql#)
endwhile
endif
Statementhandle freigeben
fb_isc_dsql_free_statement(addr(status_vector&[0]), addr(stmt&), &DSQL_drop)
endif SELECT-Ende
Transaktion abschließen
fb_isc_commit_transaction(addr(status_vector&[0]), addr(trans&))
endif
if ((status_vector&[0] = 1) and status_vector&[1])
fbError(status_vector&[])
endif
return sqlcount&
endproc
=============
HAUPTPROGRAMM
=============
window 1000, 800
cls
var db1& = fbInit(SYSDBA, masterkey, Employee.fdb)
set(errorlevel, -1)
fbSQLExec(db1&, drop table BUECHER, 1)
set(errorlevel, 1)
fbSQLExec(db1&, create table BUECHER (titel CHAR(40), autor CHAR(40), preis NUMERIC(8,2), datum TIMESTAMP), 1)
fbSQLExec(db1&, INSERT INTO buecher (titel,autor,preis) VALUES (XProfan für Dummies,RGH-Soft,19.94), 1)
clearlist
fbSQLExec(db1&, select * from BUECHER, 1)
listbox$(BUECHER:,2)
clearlist
print fbSQLExec(db1&, select EMP_NO, FIRST_NAME, LAST_NAME, JOB_CODE, JOB_GRADE, JOB_COUNTRY, FULL_NAME, PHONE_EXT, HIRE_DATE from EMPLOYEE, 1)
listbox$(EMPLOYEE:,2)
clearlist
print fbSQLExec(db1&, select * from PROJECT, 1)
listbox$(PROJECT:,2)
clearlist
print fbSQLExec(db1&, select * from CUSTOMER, 1)
listbox$2>(CUSTOMER:,2)
waitinput
fbDone(db1&)
end
|
| | | 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 | 22.04.2009 ▲ |
| |
|
RespuestaThemeninformationenDieses Thema ha 5 subscriber: |