Fonte/ Codesnippets | | | | 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 |
| | | | |
| | 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 |
| | | | |
| | 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 X3System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 11.08.2015 ▲ |
| |
|
Zum QuelltextThemeninformationenDieses Thema hat 3 subscriber: |