Bug #25691 TBlobField vs TVarBytesField - invalid class typecast
| Submitted: | 18 Jan 2007 10:22 | Modified: | 6 Apr 2007 10:38 |
|---|---|---|---|
| Reporter: | Raigedas | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | Connector / ODBC | Severity: | S3 (Non-critical) |
| Version: | 3.51.12 | OS: | Windows (win xp) |
| Assigned to: | CPU Architecture: | Any |
[18 Jan 2007 13:37]
Valeriy Kravchuk
Thank you for a problem report. Please, send exact CREATE TABLE statement used. How large is your typical JPEG image, in bytes? What connector (Connector/ODBC, Connector/Net, etc) do you use in your application?
[18 Jan 2007 14:13]
Raigedas
connector? i use ODBC 3.51.12. And i use ADO components (TADOConnection, TADOQuery) in Delphi to connect to database. size? it is not bigger than 500 KB. actually it is just a small preview. and you know, i use LongBlob which is capable to store up to 4GiB! table? ok, i can give an exactly the same create statement that i use: CREATE TABLE tfd_otherimage ( cfd_id bigint not null auto_increment, cwidth int(4), cheight int(4), cpreview longblob, cpreviewwidth int(2), cpreviewheight int(2), cext char(30), ccd_id bigint, cfile_id bigint, primary key (cfd_id) );
[6 Apr 2007 10:38]
Tonci Grgin
Hi and sorry for the delay.
I think the problem lies in copying between streams, you should look for help on that elsewhere. I tested BLOB stream creation and seek and found no problems:
- MySQL server 5.0.38BK on WinXP SP2 Pro localhost
- MyODBC 3.51.14GA
- Delphi 6
Test case:
var
stream: TStream;
blob: TStream;
BlobFld: TField;
begin
ADOConnection1.Open;
if ADOConnection1.Connected then
begin
ADOQuery1.Open;
BlobFld := ADOQuery1cpreview;
blob := ADOQuery1.CreateBlobStream(BlobFld, bmRead);
try
blob.Seek(0, soFromBeginning);
ShowMessage(IntToStr(blob.Size)); //Shows correct BLOB size
ShowMessage(IntToStr(blob.Position)); // Shows 0 correctly
finally
blob.Free;
ADOQuery1.Close;
ADOConnection1.Close;
end;
end;
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.053 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: I am working on two Delphi7 programs. The first one started to work correctly (the were problems when saving text entered into TDBMemo) after i have upgraded MySQL server from mysql-5.0.19-win32 to mysql-5.0.27-win32. Unfortunatelly the second one failed after upgrade... this second one stores and receives jpeg image content into LongBlob field. After upgrade i have an error when trying to receive (SELECT) that field: "invalid class typecast". Program worked with every older mysql version (last checked was 5.0.19) without problems... After some investigation, i have found out that my code treated the field on old mysql as TBlobField, and it treats now it as TVarBytesField on new mysql. And actually i treat this change as a bug, because good/working programs started to fail. my Delphi code that throws error: procedure expADOQueryGetFieldAsBlob(fieldname: ShortString; var stream : TMemoryStream); stdcall; var blob: TStream; begin //showmessage(expADOQuery.FieldByName(fieldname).ClassName); // just to check field classname blob := expADOQuery.CreateBlobStream(expADOQuery.FieldByName(fieldname), bmRead); // there i get an error try blob.Seek(0, soFromBeginning); try stream.CopyFrom(blob, blob.Size); except end; finally blob.Free; end; end; How to repeat: 1. create table with LongBlob field 2. insert data with content of jpeg image 3. use this code to retrieve data: procedure expADOQueryGetFieldAsBlob(fieldname: ShortString; var stream : TMemoryStream); stdcall; var blob: TStream; begin //showmessage(expADOQuery.FieldByName(fieldname).ClassName); // just to check field classname blob := expADOQuery.CreateBlobStream(expADOQuery.FieldByName(fieldname), bmRead); // there i get an error try blob.Seek(0, soFromBeginning); try stream.CopyFrom(blob, blob.Size); except end; finally blob.Free; end; end;