![]() |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Hallo,
ah, Lesefehler. Ich würde statt dem String einen TStringStream benutzen. Datei -> TFileStream -> TStringStream -> TStringStream.DataString enthält dann die Datei. PS1: Du solltest auch Stream.Size mal prüfen, das sollte einen Wert > 0 haben. PS2: FileStream.Position vor allen Aktionen auf 0 setzen (Vielleicht ist das bei Deinem alten Code schon die Lösung). |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Hallöle...8-)
Nur aus Neugier...was hat die Fichtner MySQL.pas anders als andere (FireDAC etc.) Blob ist Blob. Oder? |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Hall,
die Fichtner-Version ist älter, damit sind wahrscheinlich so etliche MySQL-Anbindungen in Delphi programmiert worden. 17-Aug-1999 mf Translated mysql.h MySQL 3.22.24 |
AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
Zitat:
Benutzt Du noch eine ältere Delphi-Version(<=Delphi 2007)? |
AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
Das QuoteStr von Delphi war sowieso noch niemals für SQL vorgesehen, denn es arbeitet nach Standard der Pascal-Strings, also behandelt ausschließlich das '
und vor allem ein \ oder Steuerzeichen machen danach weiterhin viel Spaß. Außerdem wird es hier ab Delphi 2009 schön knallen, wenn man Binärdaten in einen String/UnicodeSting packt, denn Dabei werden natürlich Bytes verändert, entsprechend der aktuellen Systemsprache (ANSI>Unicode) ![]() |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Moin...:P
Zitat:
|
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Hallo,
Zitat:
Ich wollte damit zeigen, dass bereits so früh begonnen hatte. |
AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
Ich habe es nun mit einem Prepared Statement gelöst. Für den Fall, dass jemand auch das mal braucht, das folgende Beispiel basiert auf das Prepared Statement Demo "StmtDemo", das im aktuellen
![]()
Delphi-Quellcode:
Wobei die testblob Tabelle wie folgt ausschaut:
procedure TForm1.Button3Click(Sender: TObject);
var stmt: PMYSQL_STMT; bind: PMYSQL_BIND; affected_rows: my_ulonglong; param_count: Integer; InsertQuery: String; fs: TFileStream; data: array of byte; filesize: Int64; begin Memo.Lines.Add('mysql_stmt_init()'); stmt := mysql_stmt_init(LibHandle); if (stmt=nil) then begin Memo.Lines.Add('mysql_stmt_init(), out of memory'); exit; end; Memo.Lines.Add('mysql_stmt_init() done'); InsertQuery := 'INSERT INTO testblob(filedata) VALUES(?)'; Memo.Lines.Add('mysql_stmt_prepare()'); if (mysql_stmt_prepare(stmt, PAnsiChar(InsertQuery), Length(InsertQuery))<>0) then begin Memo.Lines.Add('mysql_stmt_prepare(), INSERT failed'); Memo.Lines.Add(mysql_stmt_error(stmt)); end; Memo.Lines.Add('mysql_stmt_prepare() done'); Memo.Lines.Add('mysql_stmt_param_count()'); param_count := mysql_stmt_param_count(stmt); Memo.Lines.Add(Format('total parameters in INSERT: %d', [param_count])); if (param_count <> 1) then begin Memo.Lines.Add('invalid parameter count returned by MySQL'); exit; end; bind := mysql_bind_init(1); //** Different to org. Demo: Alloc 3 MYSQL_BIND ** try fs := TFileStream.Create('TestDatei1.txt',fmOpenRead); try SetLength(data,fs.Size); fs.ReadBuffer(data[0],fs.Size); filesize := fs.Size; finally fs.Free; end; mysql_bind_set_param(bind, 0, MYSQL_TYPE_BLOB, @data[0], filesize, @filesize, nil); Memo.Lines.Add('mysql_stmt_bind_param()'); if mysql_stmt_bind_param(stmt, bind) then begin Memo.Lines.Add('mysql_stmt_bind_param() failed'); Memo.Lines.Add(mysql_stmt_error(stmt)); exit; end; Memo.Lines.Add('mysql_stmt_bind_param() done'); Memo.Lines.Add('mysql_stmt_execute()'); if (mysql_stmt_execute(stmt)<>0) then begin Memo.Lines.Add('mysql_stmt_execute() failed'); Memo.Lines.Add(mysql_stmt_error(stmt)); exit; end; Memo.Lines.Add('mysql_stmt_execute() done'); affected_rows := mysql_stmt_affected_rows(stmt); Memo.Lines.Add(Format('total affected rows(insert 2): %u', [affected_rows])); if (affected_rows <> 1) then begin Memo.Lines.Add('invalid affected rows by MySQL'); exit; end; finally FreeMem(bind); end; if mysql_stmt_close(stmt) then begin Memo.Lines.Add('failed while closing the statement'); Memo.Lines.Add(mysql_stmt_error(stmt)); exit; end; end;
Code:
CREATE TABLE `testblob` (
`id` int(11) NOT NULL auto_increment, `filename` varchar(200) default NULL, `filesize` int(11) default NULL, `filedata` longblob, PRIMARY KEY (`id`)); Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz