AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Inhalt eines Blobfeldes nur bei Abruf laden
Thema durchsuchen
Ansicht
Themen-Optionen

Inhalt eines Blobfeldes nur bei Abruf laden

Ein Thema von Moony · begonnen am 24. Apr 2008 · letzter Beitrag vom 25. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#1

Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 10:35
Datenbank: Oracle • Zugriff über: ODAC oder ADO
Hallo zusammen,

folgende Situation ist gegeben:

Ich greife über die ODAC oder ADO Komponente auf einen Oracle Server zu, indem eine SQL Anweisung ausgeführt wird (SELECT * FROM Table). In dieser Tabelle ist mindestens ein Blobfeld vorhanden. Je nachdem wie viele Daten jedes Blobfeld enthält, dauert die Übertragung sehr lange (ca. 5-10 Minuten) bis das Query die Datensätze in das DBGrid lädt.

Meine Frage an dieser Stelle ist:
Gibt es eine Möglihckeit zwar alle Felder der Datenbank zu holen, aber beim Inhalt des Blobfeldes eine Ausschlußklausel zu setzen, so dass die Inhalte der Blobfelder explizit bei direktem Abruf des Datensatzes erfolgen? Somit würde sich die Dauer der Datenübertragung um 90% verringern.

Danke & Gruß, Moony
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 10:46
Sollte bei Oracle eigentlich automatisch so sein, da die Blobs separat von der Tabelle gespeichert werden.
Du könntest das Blob-Feld als Dummy holen.
Markus Kinzler
  Mit Zitat antworten Zitat
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 10:50
Und wie soll das gehen?

Wie gesagt, ich führe eine normale SQL Anweisung aus, dennoch braucht das Query so lange, um die Tabelle abzurufen.
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 10:55
Versuch mal
SELECT <So. Felder>, CAST( null as BLOB) as <Blobfeldname> from <Tabelle>;
Markus Kinzler
  Mit Zitat antworten Zitat
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 11:02
Diese Abfrage setzt aber voraus, dass ich alle Feldnamen kenne und auch weiß welche Felder Blobfelder sind? Ist das richtig?
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 11:10
Ja. Aber ich würde mal in den Komponenten schauen, ob man das automatische Fetchen der Blobs unterbinden kann (wenn es wirklich das Problem ist)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 11:14
Erst

SELECT * from <Tabelle> where 1=2; Um Felder + Feldtypen zu bekommen
und dann nur alle Nicht-Blob-Felder abfragen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 11:45
Also, ich habs jetzt folgendermaßen gemacht:

Delphi-Quellcode:
  OraQuery1.Close;
  OraQuery1.SQL.Clear;
  SQL := 'SELECT * FROM ' + mytable + ' WHERE 1=2';
  OraQuery1.SQL.Add(SQL);
  OraQuery1.Open;
  Lst := TStringList.Create;
  LstBlob := TStringList.Create;
  LstNonBlob := TStringList.Create;
  try
    OraQuery1.GetFieldNames(Lst);
    
    for i := 0 to Lst.Count - 1 do
    begin
      if OraQuery1.FieldByName(Lst.Strings[i]).IsBlob then
        LstBlob.Add(Lst.Strings[i])
      else LstNonBlob.Add(Lst.Strings[i]);
    end;

    SQL := 'SELECT ' + LstNonBlob.CommaText + ',';

    for i := 0 to LstBlob.Count - 1 do
    begin
      SQL := SQL + 'CAST(NULL AS BLOB) AS ' + LstBlob.Strings[i];

      if i < (LstBlob.Count - 1) then
         SQL := SQL + ',';
    end;

    SQL := SQL + ' FROM ' + mytable;

    OraQuery1.Close;
    OraQuery1.SQL.Clear;
    OraQuery1.SQL.Add(SQL);
    OraQuery1.Open;
  finally
    Lst.Free;
    LstBlob.Free;
    LstNonBlob.Free;
  end;
Wenn ich das Query dann öffnen möchte gibts folgende Fehlermeldung:

"ORA-00932: inconsistent datatypes:expected- got BLOB"
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 12:11
Hallo,

hast du mal <SQL> vor dem Open angesehen ?
Wenn z.B. gar kein Blob in der Tabelle ist,
steht da

select x,y, from Table.

Das letzte Komma ist falsch.



Heiko
Heiko
  Mit Zitat antworten Zitat
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Inhalt eines Blobfeldes nur bei Abruf laden

  Alt 24. Apr 2008, 12:17
@hoika:
Das stimmt wiederum. Das werde ich ändern. Aber das ist nicht die Ursache, weil ich weiß dass 1 Feld definitv ein Blobfeld ist.

@mkinzler:
Das ist das Problem! Die Bilddaten werden bei dem SQL String mitgeladen, was völlig unnötig ist. Das frißt nur jede Menge Performance und Zeit die Tabelle überhaupt angezeigt zu bekommen. Das einzige was ich einstellen kann ist, ob ich alle oder nur eingeschränkt die Datensätze lade. Nichts desto trotz lädt er bei eingeschränkten Datensätzen ebenfalls die Blobdaten mit. Deshalb brauche ich eine Möglichkeit in der SQL-Anweisung, um sagen zu können, dass ich zwar alle Felder haben möchte, aber die Blobdaten nur dann abgerufen werden, wenn ich sie wirklich benötige.
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz