AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Blob als nicht unterstützter Datentyp nur in CGI?
Thema durchsuchen
Ansicht
Themen-Optionen

Blob als nicht unterstützter Datentyp nur in CGI?

Ein Thema von Jumpy · begonnen am 1. Mär 2016 · letzter Beitrag vom 2. Mär 2016
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#1

Blob als nicht unterstützter Datentyp nur in CGI?

  Alt 1. Mär 2016, 11:53
Datenbank: Oracle • Version: 11 • Zugriff über: ADO/ODBC
Hallo,

die folgende Funktion funktioniert in einer Desktop-Anwendung, aber nicht in der analogen Web-CGI. Dort kommt die Fehlermeldung: "Der Datentyp wird nicht unterstützt".

Beide Anwendungen sind in Delphi 6 und benutzen die selben BL-Logik-Klassen und die selbe Funktion, die ich als den Übeltäter ausgemacht zu haben glaube (wenn ich sie auskommentiere kommt der Fehler nicht).

Hätte jemand von euch eine Idee, woran das liegen könnte?

Delphi-Quellcode:
procedure TBL.StoreFileInDB(const fname:String; var file_id,filesize:integer);
var q:TADOQuery;
    s:TStream;
    f:TFileStream;
begin
  if file_id=0 then
    file_id:=GetNewIDFromSequencer;
  q:=TADOQuery.Create(nil);
  q.Connection:=Con;
  q.SQL.Text:='Select * From '+Table(TabDatei)+' Where ID='+IntToStr(file_id);
  q.Open;
  If FileExists(fname) then
    begin
    if q.RecordCount>0 then
      begin
      q.Edit;
      s:=q.CreateBlobStream(q.FieldByName('Datei'), bmWrite);
      s.Seek(0, soFromBeginning);
      f:=TFileStream.Create(fname, fmOpenRead or fmShareDenyWrite);
      filesize:=s.CopyFrom(f,f.Size);
      end
    else
      begin
      q.Append;
      q.FieldByName('ID').AsInteger:=file_id;
      s:=q.CreateBlobStream(q.FieldByName('Datei'), bmWrite);
      s.Seek(0, soFromBeginning);
      f:=TFileStream.Create(fname, fmOpenRead or fmShareDenyWrite);
      filesize:=s.CopyFrom(f,f.Size);
      end;
    f.Free;
    s.Free;
    q.Post;
    end
  else
    filesize:=0;
  q.Free;
end;
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#2

AW: Blob als nicht unterstützter Datentyp nur in CGI?

  Alt 1. Mär 2016, 12:26
Irgendeine Unit im CGI nicht eingebunden, aber im Anderen schon?
Die z.B. irgendwas registriert, was im CGI dann nicht vorhanden ist.


Abgesehn davon:
* doppelter Code
* keine Ressourcenschutzblöcke

Delphi-Quellcode:
procedure TBL.StoreFileInDB(const fname:String; var file_id,filesize:integer);
var q:TADOQuery;
    s:TStream;
    f:TFileStream;
begin
  if file_id=0 then
    file_id:=GetNewIDFromSequencer;
  q:=TADOQuery.Create(nil);
  try
    q.Connection:=Con;
    q.SQL.Text:='Select * From &Table Where ID=:FileID';
    q.MakroByName('Table').Value := Table(TabDatei);
    q.ParamByName('FileID').AsInteger := file_id;
    q.Open;
    If FileExists(fname) then
      begin
        if q.IsEmpty then
          begin
            q.Append;
            q.FieldByName('ID').AsInteger:=file_id;
          end
        else
          q.Edit;
        s:=q.CreateBlobStream(q.FieldByName('Datei'), bmWrite);
        try
          s.Seek(0, soFromBeginning);
          f:=TFileStream.Create(fname, fmOpenRead or fmShareDenyWrite);
          try
            filesize:=s.CopyFrom(f,f.Size);
          finally
            f.Free;
          end;
        finally
          s.Free;
        end;
        q.Post;
      end
    else
      filesize:=0;
  finally
    q.Free;
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Blob als nicht unterstützter Datentyp nur in CGI?

  Alt 1. Mär 2016, 13:28
Ich habe weiter getestet und das selbe Problem, bei der Funktion, die Dateien wieder aus der DB holt. Da die einfacher ist, habe ich damit weiter getestet:

Ändere ich das SQL-Statement für die AdoQuery von

q.SQL.Text:='Select * From '+Table(TabDatei)+' Where ID='+IntToStr(file_id); in

q.SQL.Text:='Select ID From '+Table(TabDatei)+' Where ID='+IntToStr(file_id); bekomme ich die Fehlermeldung nicht.

Also ID statt *. wobei die Tabelle eh nur als weiteres Feld das Blob-Feld Datei hat.

Es scheint also irgendwo ein Problem mit einem Blob-Feld in der ADO-Komponente oder bei ODBC zu geben, aber nur im Fall der CGI (die Desktopanwendung habe ich natürlich auf dem selben Server wie die CGI ausprobiert und die geht). Oder hat es etwas mit dem untersch. User-Kontext zu tun unter dem die CGI läuft, da ist ja dann kein User angemeldet?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Blob als nicht unterstützter Datentyp nur in CGI?

  Alt 1. Mär 2016, 19:18
Du gehst über ADO und ODBC auf eine Oracle-Datenbank.
Da gibt es schon mal drei übeltäter das du nicht mit Blobs arbeiten kannst: Der ADO-Treiber(Die Version), ODBC an sich und der verwendete Oracle-Treiber.
Bist du sicher das alle drei Treiber gleich sind? Könntest du auf einen native direkte Zugriffskomponente (z.b. von DevArt oder FireDac) umstellen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Blob als nicht unterstützter Datentyp nur in CGI?

  Alt 2. Mär 2016, 08:07
Du gehst über ADO und ODBC auf eine Oracle-Datenbank.
Da gibt es schon mal drei übeltäter das du nicht mit Blobs arbeiten kannst: Der ADO-Treiber(Die Version), ODBC an sich und der verwendete Oracle-Treiber.
Bist du sicher das alle drei Treiber gleich sind? Könntest du auf einen native direkte Zugriffskomponente (z.b. von DevArt oder FireDac) umstellen?
Ich weiß ja, dass die Zugriffs-Konstellation ungünstig ist, aber in der Desktop-Version klappt es ja. Und ich meine damit, das auch die DB-Zugriffe/Connections in beiden Versionen gleich sind, d.h. wenn es daran läge, warum geht's im normalen Programm, aber nicht in der CGI. Und wie gesagt, ich rede vom gleichen Server/Rechner, wo ich beides getestet habe.

Nichts destotrotz versuch ich jetzt mal zumindest ODBC rauszulassen und direkt via ADO auf Oracle zuzugreifen. Umbaumaßnahme läuft gerade.
Ralph
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Blob als nicht unterstützter Datentyp nur in CGI?

  Alt 2. Mär 2016, 09:00
Problem gelöst. Als ich versucht habe, das bei der Web-Anwendung so umzubauen, dass der Zugriff nicht mehr über ODBC erfolgt habe ich festgestellt, dass dies im Quelltext bereits umgesetzt war mit dem Kommentar, dass der Zugriff ohne ODBC in der CGI-Anwendung viel schneller ist.

Also habe ich das Gegenteil gemacht und die Web-Anwendung auf ODBC zurück umgestellt und siehe da, es klappt der Zugriff auf die BLOB-Felder. Ich werde jetzt in der Web-Anwendung mit zwei Connections arbeiten, einer schnellen ohne ODBC wie bisher und einer mit ODBC für diese zwei Funktionen, die mit BLOB-Feldern arbeiten können müssen. Ist nicht ideal, aber als Workarround funktioniert es. Ich werde das aber besser Kommentieren als es bisher war .

Nur für Interessierte die beiden verwendeten Connection-Strings:

Mit ODBC:
Provider= MSDASQL.1; Persist Security Info=False;User ID=XX;Data Source=DB_ODBC;Password=YY

Ohne:
Provider=MSDAORA.1;Password=YY;User ID=XX;Data Source=DB;Persist Security Info=False

Scheinbar ist bei dem direkten Zugriff der Datentyp-Blob nicht bekannt oder wird nicht erkannt?
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:31 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