Italia
Fonte/ Codesnippets

Lange Sql Strings

 

Uwe
''Pascal''
Niemeier
Hi Leute!

Habe mal ein wenig mit der Möglichkeit gespielt, Bilder o.Ä. in Datenbanken abzulegen. Hier die Ergebnisse...

Beim Schreiben langer Strings gibt es anscheinend keine Maximalgröße; mehrere 100 KB sind mit Standartfunktionen kein Problem, vorausgesetzt die db supportati entsprechende Feldtypen:
KompilierenMarkierenSeparieren
****************** Demo: Beliebig lange Strings in DB schreiben
****************** Profan : 11.1 und höher
****************** Windows: XP SP3
****************** kein © (Standartfunktionen)
window 50,50-500,500
declare Exec$
--Access
var mdb$=X:ExperimenteSQL-APIAccessTest1.mdb
var Init$=Driver={Microsoft Access Driver (*.mdb)};Dbq=+mdb$+;Uid=;Pwd=;
--SQL Express
var Init$=Driver={SQL Server};Server=(local)SQLExpress;UID=sa;PWD=sql;
SQLInit(Init$)
Exec$=DROP TABLE TCS
SQLExec Exec$,0---Fehlermeldung, wenn db nicht vorhanden => Egal!
Exec$=CREATE TABLE TCS (Feld1 MEMO)---------Access > FeldTyp MEMO
Exec$=CREATE TABLE TCS (Feld1 VARCHAR(MAX))--SQLExpress > FeldTyp VARCHAR(MAX)
SQLExec Exec$,0--db anlegen
declare Text#
var File$=C:2TestBild2.jpg-----------------------Quellpfad bitte anpassen!
var Size&=filesize(File$)
dim Text#,Size&
assign #1,File$
openrw #1
blockread(#1,Text#,0,Size&)
closerw #1
var Text$=char$(Text#,0,Size&)
dispose Text#
Text$=encode64(Text$)
Exec$=INSERT INTO TCS (Feld1) VALUES (+Text$+)
SQLExec Exec$,0--keine Größenbegrenzung beim Schreiben!
SQLDone
waitkey

Lediglich beim Einlesen der Daten werden selbige beschnitten, darum hier eine SQL-API-Möglichkeit zur Auswertung:
KompilierenMarkierenSeparieren
****************** Demo: Beliebig lange Strings aus DB lesen
****************** Profan : 11.1 und höher
****************** Windows: XP SP3
****************** © by TCS (Uwe Pascal Niemeier) 022009
--Listbox-Liste wird als Fehler-Log verwendet
--und im Fehlerfall automatisch angezeigt.
--Es wird nur das 1. Feld des 1. gefundenen Datensatzes ausgewertet!
--Also SQL-Abfrage entsprechend einrichten!
window 50,50-500,500
 $H Windows.ph
def SQLAllocHandle(3) !odbc32,SQLAllocHandle
def SQLError(8 ) !odbc32,SQLError
def SQLExecDirect(3) !odbc32,SQLExecDirect
def SQLGetData(6) !odbc32,SQLGetData
def SQLFetch(1) !odbc32,SQLFetch
def SQLFreeHandle(2) !odbc32,SQLFreeHandle

proc SQLErrorLog-----------------------------------------SQLErrorLog

    parameters Von$
    declare Error$
    SQLError(&SQLEnv,&SQLDBC,stmt&,0,0,Error#,512,0)
    Error$=string$(Error#,0)
    case len(Error$):addstring Von$+ : +Error$
    endproc-------------------------------------------------------------

    proc SQLGetDataEx---------------------------------------SQLGetDataEx

        parameters Exec$
        declare Data#,Data$,Size&,stmt&,Error#
        dim Error#,512
        clearlist
        SQLAllocHandle(3,&SQLDBC,addr(stmt&))--3=SQL_HANDLE_STMT
        SQLErrorLog(SQLAllocHandle)
        SQLExecDirect(stmt&,addr(Exec$),-3)-- -3=SQL_NTS
        SQLErrorLog(SQLExecDirect)
        dim Data#,1--Dummy-DIM
        SQLFetch(stmt&)
        SQLErrorLog(SQLFetch)
        SQLGetData(stmt&,1,99,Data#,0,addr(Size&))--99=SQL_C_DEFAULT
        --Fehlerabfrage würde zu kleinen Puffer melden (Dummy-Aufruf wg. Size&)

        if Size&>0

            dim Data#,Size&+1
            SQLGetData(stmt&,1,99,Data#,Size&+1,addr(Size&))--99=SQL_C_DEFAULT
            SQLErrorLog(SQLGetData)
            Data$=char$(Data#,0,Size&)

        endif

        SQLFreeHandle(3,stmt&)--3=SQL_HANDLE_STMT
        dispose Data#,Error#
        case %getcount>-1:listbox$(Fehler,2)
        return Data$
        endproc-------------------------------------------------------------
        ---Access
        var mdb$=X:ExperimenteSQL-APIAccessTest1.mdb
        var Init$=Driver={Microsoft Access Driver (*.mdb)};Dbq=+mdb$+;Uid=;Pwd=;
        --SQL Express
        var Init$=Driver={SQL Server};Server=(local)SQLExpress;UID=sa;PWD=sql;
        SQLInit(Init$)
        var Exec$=SELECT TOP 1 Feld1 FROM TCS
        var Text$=SQLGetDataEx(Exec$)
        Text$=decode64(Text$)
        declare Text#
        dim Text#,len(Text$)+1
        char Text#,0=Text$
        assign #1,C:2TestTest.jpg------------------------Zielpfad bitte anpassen!
        erase #1
        openrw #1
        blockwrite #1,Text#,0,len(Text$)
        closerw #1
        dispose Text#
        SQLDone

Getestet (wie man sieht) mit Access-dbs (*.mdb) (Access muß nicht disponibile sein) und MS SQL Express 2005.
Ob die Daten mit encode64() codiert werden müssen, ist möglicherweise vom Feldtyp abhängig; bei oben genannten dbs ging es nicht ohne. Im Zweifelsfall ausprobieren.

Vielleicht kanns jemand brauchen

SeeYou
Pascal
 
15.02.2009  
 




Thomas
Kallenberger
Hallo Pascal,
die API sieht gut aus - ich sollte das ganze lediglich umgekehrt haben - d.h. Daten aus einer Textdatei in un Access-Tabelle bringen. Vielleicht hat jemand einen Vorschlag! Zeile per Zeile einlesen ist irgendwie nicht so prickelnd. Danke per Eure Mühe!
Liebe Grüße
Thomas
 
30.03.2010  
 




Michael
W.
das Ganze nochmal mit Anführungszeichen und Kommentarzeichen. Die sind irgendwo verschollen...
KompilierenMarkierenSeparieren
'****************** Demo: Beliebig lange Strings in DB schreiben
'****************** Profan : 11.1 und höher
'****************** Windows: XP SP3
'****************** kein © (Standartfunktionen)
window 50,50-500,500
declare Exec$
'--Access
var mdb$="X:ExperimenteSQL-APIAccessTest1.mdb"
var Init$="Driver={Microsoft Access Driver (*.mdb)};Dbq=+mdb$+;Uid=;Pwd=;"
'--SQL Express
var Init$="Driver={SQL Server};Server=(local)SQLExpress;UID=sa;PWD=sql;"
SQLInit(Init$)
Exec$="DROP TABLE TCS"
SQLExec Exec$,0'---Fehlermeldung, wenn db nicht vorhanden => Egal!
Exec$="CREATE TABLE TCS (Feld1 MEMO)"'---------Access > FeldTyp MEMO
Exec$="CREATE TABLE TCS (Feld1 VARCHAR(MAX))"'--SQLExpress > FeldTyp VARCHAR(MAX)
SQLExec Exec$,0'--db anlegen
declare Text#
var File$="C:2TestBild2.jpg"'-----------------------Quellpfad bitte anpassen!
var Size&=filesize(File$)
dim Text#,Size&
assign #1,File$
openrw #1
blockread(#1,Text#,0,Size&)
closerw #1
var Text$=char$(Text#,0,Size&)
dispose Text#
Text$=encode64(Text$)
Exec$="INSERT INTO TCS (Feld1) VALUES (" + "Text$" + ")"
SQLExec Exec$,0'--keine Größenbegrenzung beim Schreiben!
SQLDone
waitkey

KompilierenMarkierenSeparieren
'****************** Demo: Beliebig lange Strings aus DB lesen
'****************** Profan : 11.1 und höher
'****************** Windows: XP SP3
'****************** © by TCS (Uwe Pascal Niemeier) 022009
'--Listbox-Liste wird als Fehler-Log verwendet
'--und im Fehlerfall automatisch angezeigt.
'--Es wird nur das 1. Feld des 1. gefundenen Datensatzes ausgewertet!
'--Also SQL-Abfrage entsprechend einrichten!
window 50,50-500,500
 $H Windows.ph
def SQLAllocHandle(3) !odbc32,SQLAllocHandle
def SQLError(8 ) !odbc32,SQLError
def SQLExecDirect(3) !odbc32,SQLExecDirect
def SQLGetData(6) !odbc32,SQLGetData
def SQLFetch(1) !odbc32,SQLFetch
def SQLFreeHandle(2) !odbc32,SQLFreeHandle

proc SQLErrorLog'-----------------------------------------SQLErrorLog

    parameters Von$
    declare Error$
    SQLError(&SQLEnv,&SQLDBC,stmt&,0,0,Error#,512,0)
    Error$=string$(Error#,0)
    case len(Error$) : addstring Von$+" : "+Error$

endproc'-------------------------------------------------------------

proc SQLGetDataEx'---------------------------------------SQLGetDataEx

    parameters Exec$
    declare Data#,Data$,Size&,stmt&,Error#
    dim Error#,512
    clearlist
    SQLAllocHandle(3,&SQLDBC,addr(stmt&))'--3=SQL_HANDLE_STMT
    SQLErrorLog("SQLAllocHandle")
    SQLExecDirect(stmt&,addr(Exec$),-3)'-- -3=SQL_NTS
    SQLErrorLog("SQLExecDirect")
    dim Data#,1'--Dummy-DIM
    SQLFetch(stmt&)
    SQLErrorLog("SQLFetch")
    SQLGetData(stmt&,1,99,Data#,0,addr(Size&))'--99=SQL_C_DEFAULT
    '--Fehlerabfrage würde zu kleinen Puffer melden (Dummy-Aufruf wg. Size&)

    if Size& > 0

        dim Data#,Size&+1
        SQLGetData(stmt&,1,99,Data#,Size&+1,addr(Size&))'--99=SQL_C_DEFAULT
        SQLErrorLog("SQLGetData")
        Data$=char$(Data#,0,Size&)

    endif

    SQLFreeHandle(3,stmt&)'--3=SQL_HANDLE_STMT
    dispose Data#,Error#
    case %getcount > -1 : listbox$(Fehler,2)
    return Data$

endproc'-------------------------------------------------------------

'---Access
var mdb$="X:ExperimenteSQL-APIAccessTest1.mdb"
var Init$="Driver={Microsoft Access Driver (*.mdb)};Dbq=+mdb$+;Uid=;Pwd=;"
'--SQL Express
var Init$="Driver={SQL Server};Server=(local)SQLExpress;UID=sa;PWD=sql;"
SQLInit(Init$)
var Exec$="SELECT TOP 1 Feld1 FROM TCS"
var Text$=SQLGetDataEx(Exec$)
Text$=decode64(Text$)
declare Text#
dim Text#,len(Text$)+1
char Text#,0 = Text$
assign #1,"C:2TestTest.jpg"'------------------------Zielpfad bitte anpassen!
erase #1
openrw #1
blockwrite #1,Text#,0,len(Text$)
closerw #1
dispose Text#
SQLDone
 
XProfan X3
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
11.08.2015  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

8.344 Views

Untitledvor 0 min.
Uwe ''Pascal'' Niemeier28.12.2023
p.specht20.11.2021
Uwe Lang20.11.2021
Manfred Barei19.11.2021
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie