Page 1 of 2 1 2 LastLast
Results 1 to 15 of 18

Thread: Blob opslaan in Interbase

  1. #1

    Blob opslaan in Interbase

    Ben al 2 dagen aan het stoeien om images (JPEG) op te slaan in Interbase (Blob). In Firebird geen probleem, maar Interbase weigert, continue Exceptions

    Dit is mijn test-code (FDConnection1 staat op main-form):
    Delphi Code:
    1. procedure TForm2.Button1Click(Sender: TObject);
    2. var
    3.   BlobStream: TMemoryStream;
    4.   oImage: TImage;
    5.   cName: String;
    6.   oQuery: TFDQuery;
    7.   nID: Integer;
    8. begin
    9. //  if OpenDialog1.Execute then
    10.   begin
    11.     cName := 'P:\Jonker\Images\test.jpg';
    12. //    nID := FDQuery1.FieldByName('DrawingNrID').Value;
    13.     nID := 746;
    14.     try
    15.       BlobStream:= TMemoryStream.Create;
    16.       oImage := TImage.Create(Self);
    17.       oQuery := TFDQuery.Create(nil);
    18.       oQuery.Connection := FDConnection1;
    19.       fdConnection1.Connected := True;
    20.  
    21.       try
    22.         oImage.Bitmap.LoadFromFile(cName);
    23.         oImage.Bitmap.SaveToStream(BlobStream);
    24.         oImage.Bitmap.SaveToFile('c:\temp\image.jpg');
    25.  
    26.         BlobStream.Seek(0, 0);
    27.           oQuery.SQL.Clear;
    28.           oQuery.SQL.Append('Update Drawings set  Drawing = :Drawing where DrawingNrID = ' + IntToStr(nID));
    29.           oQuery.ParamByName('nID').Value := nID;
    30.  
    31.  
    32. // Hieronder gaat  het fout
    33.          oQuery.ParamByName('Drawing').LoadFromStream(BlobStream, ftBlob);
    34.           oQuery.ExecSQL;
    35.           oQuery.Close;
    36.           BlobStream.Free;
    37.           oImage.Free;
    38.           oQuery.Free;
    39.       except
    40.         // Handle exceptions
    41.         Raise;
    42.       end;
    43.     except
    44.       BlobStream.Free;
    45.       oImage.Free;
    46.       oQuery.Free;
    47.     end;
    48.   end;
    49. end;
    Iemand enig idee hoe op te lossen? Moet met FMX, omdat ook moet gaan draaien in iOS/Android. Ophalen van data/andere queries/updates/inserts werken allemaal, alleen die Blob-update en/of insert niet. Ook geprobeerd met StoredProc, zelfde resultaat.
    Last edited by Marcel; 24-Mar-15 at 09:52.
    Add one binary to 1, and suddenly
    you end up with 10.

  2. #2
    Marius
    Join Date
    Jul 2013
    Location
    Groningen
    Posts
    178
    Klinkt eigenlijk als een bug in Interbase, maar voor de zekerheid, wat is de definitie van het veld "Drawing"?

  3. #3
    hmmm Interbase op een mobiel? Dat gaat spannend worden denk ik.

    Verder ben ik net als Marius wel benieuwd wel Blobtype je aan dat veld hebt gegeven in Interbase.

  4. #4
    Blob Sub_type 0, segment size 4096
    Driver is IbToGo.dll
    Lezen en schrijven van alle andere data is geen probleem, kan ook de blob-data die al in de database zit (test-jpg's) gewoon uitlezen.
    Ik kan, als ik direct in de Table schrijf (
    FDTABLE1.Edit;
    TBlobField(FDTable1.FieldByName('JPEG')).LoadFromF ile(cName);
    fdtABLE1.Post)
    wél de Image erin krijgen (dat is ook hoe ik de test-images erin heb gekregen), maar dat is niet de manier waarop ik kan/wil werken met honderden images in de table (duurt dan allemaal een beetje lang, zeker met openen (paar minuten)).
    Mag de files ook niet als jpg opslaan op schijf, MOETEN in de (straks te encrypten) database (bedrijfseis), én moet allemaal offline kunnen (anders had ik Datasnap kunnen gebruiken, maar helaas).
    Last edited by TheMadMan; 24-Mar-15 at 12:05.
    Add one binary to 1, and suddenly
    you end up with 10.

  5. #5
    Marius
    Join Date
    Jul 2013
    Location
    Groningen
    Posts
    178
    De blob is prima gedefinieerd.. Ik weet niet welke versie van interbase en ibtogo je gebruikt, maar in de XE3 update wordt nogal het een en ander aan bugs genoemd in combinatie met blobs (geen idee of ze relevant zijn voor jouw situatie). Ik zou interbase proberen te updaten of een nieuwe(re) Interbase versie te installeren.

    http://docs.embarcadero.com/products...e3/Readme.html
    http://qc.embarcadero.com/wc/qcmain.aspx?d=106199
    http://qc.embarcadero.com/wc/qcmain.aspx?d=106199
    https://www.google.nl/search?q=%22ib...ug%22&filter=0

    Misschien kom je hier wat verder mee (ik kan niet veel vinden op het internet)..

  6. #6
    Ik ben aan het testen met XE7, dus de bugs zouden daar zo onderhand wel uit mogen/moeten zijn. Ben nog niet verder gekomen hiermee, 2e (en hopelijk laatste) probleem diende zich aan: Embedded interbase draait prima op Windows (32/64bit), op Android, op Mac, op iOS-simulator, maar NIET op iOS-device (iPhone 4).
    FBIBphysDriverlink staat erop, vendorlib verwijst naar ibtogo.a (bij iOS-simulator naar ibtogo.dylib), maar kijg op iOS constant de melding: Product INTERBASE is not licensed ??????
    Iemand enig idee hoe dit op te lossen?
    Add one binary to 1, and suddenly
    you end up with 10.

  7. #7
    Quote Originally Posted by TheMadMan View Post
    ... dus de bugs zouden daar zo onderhand wel uit mogen/moeten zijn.
    Whahahahahaha

    (sorry, ik kon het even niet laten)

  8. #8
    Marius
    Join Date
    Jul 2013
    Location
    Groningen
    Posts
    178
    Foei Rik! Maar toegegeven, ik dacht eigenlijk hetzelfde

    Als het inderdaad een bug is schat ik in dat je de eerste 1 a 2 jaar geen oplossing hiervoor krijgt. Kortom, dump dat Interbase gedrocht en schakel over naar Firebird die teninste wel regelmatig minor updates heeft. (en nee, Firebird is ook niet vlekkeloos)

  9. #9
    Quote Originally Posted by Marius2 View Post
    Kortom, dump dat Interbase gedrocht en schakel over naar Firebird die teninste wel regelmatig minor updates heeft. (en nee, Firebird is ook niet vlekkeloos)
    En met weinig zoekwerk is er een embedded versie van Firebird voor iOS te vinden.
    http://www.firebirdnews.org/it-is-ti...droid-and-ios/
    http://paulbeachsblog.blogspot.fr/20...rd-on-ios.html

  10. #10
    Marius
    Join Date
    Jul 2013
    Location
    Groningen
    Posts
    178
    Goed bezig Rik!

  11. #11
    Had die link van PaulBeach wel al eerder gevonden, maar toen werd alleen nog gesproken over een embedded versie voor Mac (nog niet voor iOS, of ik heb toen de verkeerde links gehad). Anyway, ga hiermee aan het testen, kijken of dit wel lukt (hoop dat het dan ook onder Android gaat lopen, anders krijgen we dát weer). Alvast bedankt, ik laat het weten.
    Add one binary to 1, and suddenly
    you end up with 10.

  12. #12
    Met Firebird (dylibs ???) zelfde probleem, INTERBASE is not licensed. Lijkt wel of het probleem in de FireDac zit, en niet zozeer in de Interbase.
    Add one binary to 1, and suddenly
    you end up with 10.

  13. #13
    Quote Originally Posted by TheMadMan View Post
    ... INTERBASE is not licensed. Lijkt wel of het probleem in de FireDac zit, en niet zozeer in de Interbase.
    Ja... Ik kan met niet voorstellen dat een melding als "INTERBASE is not licensed" uit Firebird SQL komt

    Heb je het server-field leeg gelaten? (want als je localhost daar gebruikt kun je deze melding krijgen)

    Verder is er nog wel wat over te vinden:
    Google INTERBASE+is+not+licensed
    en INTERBASE+is+not+licensed+dylibs
    http://codeverge.com/embarcadero.del...for-ib/1088068

  14. #14
    Ik vul de connectie-params in voordat ik de connectie open;
    {$ifdef MSWINDOWS}
    DBPath := TPath.GetDocumentsPath + PathDelim + 'test.fdb';
    VendorLib := TPath.GetDocumentsPath + PathDelim + 'bin\fbembed.dll';
    {$endif}

    {$ifdef IOS}
    DBPath := TPath.GetDocumentsPath + PathDelim + 'test.fdb';
    VendorLib := TPath.GetDocumentsPath + PathDelim + 'bin\libfbembed.dylib';
    {$endif}

    FDConnection1.Params.Clear;
    FDConnection1.Params.Add(Format('DriverID=%s', ['FB']));
    FDConnection1.Params.Add(Format('Database=%s', [DBPath]));
    FDConnection1.Params.Add(Format('CharacterSet=%s', ['UTF8']));
    FDConnection1.Params.Add(Format('user_name=%s', ['sysdba']));
    FDConnection1.Params.Add(Format('password=%s', ['masterkey']));
    FDConnection1.Params.Add(Format('ExtendedMetadata= %s', ['False']));
    // FDConnection1.Params.Add(Format('CreateDatabase=%s ', ['Yes']));
    FDConnection1.Params.Add(Format('SqlDialect=%s', ['3']));
    FDConnection1.Params.Add(Format('Protocol=%s', ['Local']));
    FDConnection1.Params.Add(Format('Server=%s', ['']));
    FDConnection1.Params.Add(Format('Port=%s', ['']));

    FDPhysFBDriverLink1.VendorLib := VendorLib;
    FDConnection1.Open; ==> INTERBASE is not Licensed

    dylibs op diverse locaties neergezet in VendorLib (binnen/buiten bin-folder, om te kijken of daar iets mee gebeurd (designtime maakt dat wel verschil)), FDPhysFBDriverLink wel/niet aanwezig, nada.
    Add one binary to 1, and suddenly
    you end up with 10.

  15. #15
    Marius
    Join Date
    Jul 2013
    Location
    Groningen
    Posts
    178
    Gokje; Probeer je dit op je desktop te draaien? Zoja dan heb ik het vermoeden dat jouw code goed is, maar dat interbase geinstalleerd is en dat deze op poort 3050 staat te luisteren (in plaats van good old Firebird) want anders kun je deze foutmelding echt niet krijgen (zou anders wel goed verborgen reclame zijn <g>). Probeer eens alle Firebird en Interbase services te stoppen en dan alleen Firebird te starten.

    Ik vindt het allemaal wel wat raar omdat je expliciet de fbembedded.dll gebruikt (daar heb ik geen recente ervaringen mee). Toch niet gekopieerd van fbclient naar fbembedded? (dat zou de enige reden zijn dat je applicatie de lokale poort 3050 zou willen openen)

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •