Français
Source/ Codesnippets

Binäre Blob Felder Lesen écrivons Sql

 
Binäre BLOB Felder Lesen écrivons SQL - de RGH aus dem Fil [...]  .

RGH
Lesen et écrivons binärerer BLOB-Felder avec XProfan

et ici cela komplette Beispiel avec binären BLOB-Feldern. (Pour Blobfelder avec langen Texten devrait es quelque chose umgeschrieben volonté.) Im Beispiel wird une Bild-Dossier comme BLOB gespeichert, wieder ausgelesen et sur qui Festplatte zurückgeschrieben.
(Bien sûr peut ici beliebige Dateitypen verwandt volonté.)
KompilierenMarqueSéparation
{ ========================================

    KONSTANTEN UND API FUNKTIONEN DEFINIEREN
    ========================================
    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
    def SQLExecDirect(3) !odbc32,SQLExecDirect
    def SQLGetData(6) !odbc32,SQLGetData
    def SQLFetch(1) !odbc32,SQLFetch

}

================
BLOB-Funktionen:
================

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

proc SQLGetBlob

    parameters Exec$
    declare Data#, size&, stmt&, ret%, error$
    SQLAllocHandle(&SQL_HANDLE_STMT, &SQLDBC, addr(stmt&))
    SQLExecDirect(stmt&, addr(Exec$), len(Exec$))
    dim Data#, 1  Dummy-DIM zur Größenermittlung
    Ret% = SQLFetch(stmt&)

    If LoWord(Ret%) = &SQL_SUCCESS

        Ret% = SQLGetData(stmt&, 1, &SQL_BINARY, Data#, 0, addr(size&))

        if Size& > 0

            dim Data#, size&
            SQLGetData(stmt&, 1, &SQL_BINARY, Data#, SizeOf(Data#), addr(size&))

        endif

    Else

        error$ = SQLFetch

    endif

    SQLFreeHandle(&SQL_HANDLE_STMT, stmt&)
    Case Len(error$) :  MessageBox(error$ +  fehlgeschlagen!, ODBC-Fehler, 16)
    Return Data#

endproc

=============================
Das eigentliche Testprogramm:
=============================
declare db&, sql$, bild#, sbild$, datei$, startpos&, teil$, teilnr%, ergebnis$, bildnr%
cls
db& = sqlinit(DSN=KursDB;UID=SYSDBA;PWD=masterkey;DBNAME=D:\Dokumente\FireBird\KURSDB.GDB)

If db& > 0

    =================
    TABELLEN ERZEUGEN
    =================
    Tabellen löschen, wenn schon vorhanden
    Set(Errorlevel,0)
    SQLExec DROP TABLE bilderliste,0
    SQLExec DROP TABLE bild,0
    Set(Errorlevel,1)
    Tabelle für die Bilder neu erzeugen
    SQLExec CREATE TABLE bilderliste (name CHAR(40), fotograf CHAR(40), bildnr INTEGER, bild BLOB),1
    =========================
    BILD IN TABELLE SPEICHERN
    =========================
    Da für eine Bild zwei Schreibvorgänge nötig sind, werden wir diese in eine Transaktion
    zusammmenfassen.
    Zunächst also die automatische Bestätigung einzelner SQL-Befehle ausschalten. Die folgenden
    SQL-Befehle werden also erst mal zwischengespeichert ohne wirklich in die Datenbank zu gehen
    sqlexec #AUTOCOMMIT_OFF, 0
    Tabelle Bilderliste füllen: Bild 1 hinzufügen, das Bild selbst noch weg lassen
    sql$ = INSERT INTO bilderliste VALUES (Helloween Muffins,Jasmin Hülsmann,1,)
    sqlexec sql$,0
    Nun das Bild in Bild# einlesen
    datei$ = HELLOWEEN.JPG
    Dim Bild#, FileSize(datei$)
    BlockRead(datei$, Bild#, 0, FileSize(datei$))
    Und das Bild in die Tabelle einfügen
    ACHTUNG: Das SQL-Statement darf nur ein Feld enthalten und zwar das BLOB-Feld (nur INSERT oder UPDATE)
    SQLPutBlob(UPDATE bilderliste SET bild = ? WHERE bildnr = 1, Bild#)
    Wenn bis hierher alles glatt gegangen ist, konnte alle Felder in den Satz geschrieben
    werden. Es erfolgt also die Bestätigung, dass es nun wirklich in die Datenbank kann:
    sqlexec #COMMIT, 0
    Für die folgenden Befehle benötigen wir die Transaktionskontrolle nicht mehr, so dass
    jede SQL-Anweisung automatisch bestätigt werden soll:
    sqlexec #AUTOCOMMIT_ON, 0
    =========================
    BILD AUS TABELLE AUSLESEN
    =========================
    Ein Bild aus der Tabelle Bilderliste auswählen, dabei das BLOB-Feld bild nicht anzeigen
    sql$ = SELECT name, fotograf, bildnr FROM bilderliste
    clearlist
    sqlexec sql$,1
    Überschrift und Trennzeile entfernen
    DeleteString(0,0)
    DeleteString(0,0)
    ergebnis$ = listbox$(Bild auswählen und mit OK bestätigen:,2)

    if ergebnis$ >

        Die Nummer des gewählten Bildes steht im dritten Feld
        bildnr% = Int(Val(SubStr$(ergebnis$,3,|)))
        Jetzt das Bild laden
        Wir benötigen jetzt nur das BLOB-Feld bild
        ACHTUNG: Das SQL-Statement darf nur ein Feld enthalten und zwar das BLOB-Feld (nur SELECT)
        sql$ =SELECT bild FROM bilderliste WHERE bildnr =  + Str$(bildnr%)
        Clear Bild#
        Bild# = SQLGetBlob(sql$)
        Bild auf Festplatte speichern
        blockwrite GelesenesBild.jpg, Bild#, 0, SizeOf(Bild#)
        Bild zur Kontrolle anzeigen
        DrawSizedPic GelesenesBild.jpg, 0, 0 - 400, 300, 0

    EndIf

    SQLDone

Else

    Print Datenbank konnte nicht geöffnet werden!

Endif

waitinput
end

un technischer Hinweis encore: aussi pour qui dessus erwähnten Correction dans XProfan wird cela Lesen binärer Blobs avec SQLExec pas direct possible son. là ging es um longtemps Text-Blobs.
 
05.03.2009  
 



Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

4.593 Views

Untitledvor 0 min.
H.Brill31.01.2022
Andre Rohland26.05.2017
Georg Teles16.01.2016
inhalt23.01.2015
plus...

Themeninformationen

cet Thema hat 1 participant:

iF (1x)


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie