AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken D4: Query.ParamByName('').AsBlob := '' ersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

D4: Query.ParamByName('').AsBlob := '' ersetzen

Ein Thema von hoika · begonnen am 13. Feb 2015 · letzter Beitrag vom 13. Feb 2015
Antwort Antwort
hoika

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

D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 09:38
Datenbank: FB • Version: 2 • Zugriff über: IBDAC
Hallo,
ich muss ein grosses Projekt von D2007 auf D4 portieren (jaja ).
Benutzt wird IBDAC.

Der Code

Query.ParamByName('Param1').AsBlob := 'bla';

wird angemeckert

richtig ist
Query.ParamByName('Param1').AsBlob := BytesOf('bla');

Das sind aber leider sehr viele Stellen.
Da wird eine von TIBCQuery abgeleitete eigene Query-Komponente benutzen,
könnte ich die erweitern.
Im Moment sieht da so aus:

Delphi-Quellcode:
procedure TQuery.StringToBlob(const ABlobFeldName, AWert: String);
begin
  {$IFDEF VER250}
  ParamByName(ABlobFeldName).AsBlob := BytesOf(AWert);
  {$ELSE}
  ParamByName(ABlobFeldName).AsBlob := AWert;
  {$ENDIF}
end;
aus
Query.ParamByName('Param1').AsBlob := 'bla';
wird
Query.StringToBlob('Param1', 'bla');

(Der Code soll schrittweise umgestellt werden, soll also mit D2007 und XE4 laufen.)

Das ist aber trotzdem noch viel zu viel Aufwand.
Bekomme ich denn das ParamByName('').AsBlob nicht irgendwie in meine eigene Klasse rein
z.B.
function ParamByName2(Name: String); TDAParam2;
so dass ich einfach nur Query.ParamByName2('Param1').AsBlob := 'bla'; schreiben muss?

Wie bekomme ich aber das ('Param1') in die Klasse rein,
oder nehme ich eine Funktion, dass passt aber auch nicht richtig.

Klappt das überhaupt, dass aus ich sowas
Query.ParamByName2('Param1').AsBlob := 'bla';
mit einer eigenen Klasse hinbekomme?

Ich hoffe, jemand kann mir helfen.

Noch mal der Wunsch: so wenig wie möglich ändern und das so schnell wie möglich

PS:
Ich habe den Quellcode von IBDAC, aber ich werden daraus nicht schlau.

Danke

Heiko


So richtig komme ich hier nicht weiter
Heiko

Geändert von hoika (13. Feb 2015 um 09:54 Uhr)
  Mit Zitat antworten Zitat
hoika

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

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 10:17
Hallo,

so ich habe es selber hinbekommen.
Falls es jemand interessiert:

Delphi-Quellcode:
type
  TDAParamS = class(TDAParam)
    procedure SetBlob(S: String);
    property AsBlob: String
      write SetBlob;
  end;

procedure TDAParamS.SetBlob(S: String);
begin
  DataType := ftBlob;
  Value := S;
end { TDAParamS.SetBlob } ;



type
  TQuery = class(TIBCQuery)
    function ParamByNameS(const Name: string): TDAParamS;
  end;

function TQuery.ParamByNameS(const Name: string): TDAParamS;
begin
  Result := TDAParamS(ParamByName(Name));
end;
Der Knackpunkt war TDAParamS(ParamByName(Name));

Das S steht übrigens für String .

Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 10:44
ich muss ein grosses Projekt von D2007 auf D4 portieren (jaja ).

...

(Der Code soll schrittweise umgestellt werden, soll also mit D2007 und XE4 laufen.)
Nun erschreck uns doch nicht erst so...

Das kannst du auch in einen Class-Helper packen, dann kann der restliche Code so bleiben.

Delphi-Quellcode:
type
  TDAParamHelper = class helper for TDAParam
  public
    function GetAsBlob: string;
    procedure SetAsBlob(const AValue: string);
    property AsBlob: string read GetAsBlob write SetAsBlob;
  end;

function TDAParamHelper.GetAsBlob: string;
begin
  Result := Value;
end;

procedure TDAParamHelper.SetAsBlob(const AValue: string);
begin
  DataType := ftBlob;
  Value := AValue;
end;
Den Class-Helper in eine separate Unit packen, über ein IFDEF für D2007 ausblenden bzw. für XE4 einblenden, die Unit an den nötigen Stellen ans Ende der Uses-Anweisung stellen und gut isses.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

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

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 13:07
Hallo,

hmmmmmm.
Aber das AsBlob gibt es doch bereits,
dass soll doch nicht überschrieben werden,
sondern nur für Strings ersetzt werden?

class helper kannte ich zwar (schon eine Weile her, seit ich darüber gelesen habe),
aber ich könnte ein AsBlobS machen.

Probiere ich mal aus, danke!

Warum erschrecken ???

Das erste Projekt (~500.000 Zeilen) ist bereits erledigt,
jetzt kommt das große dran (~2.000.0000 Zeilen).

Für das leidige FormatSettings habe ich mir jetzt auch was gebastelt


Heiko
Heiko

Geändert von hoika (13. Feb 2015 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Jumpy

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

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 14:06
Warum erschrecken ???
Weil du zuerst von D4 geschrieben hast (was erschreckt, da Rückschritt zu D2007) und dann erst später von XE4, was du tatsächlich meintest.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 14:13
Aber das AsBlob gibt es doch bereits,
dass soll doch nicht überschrieben werden,
sondern nur für Strings ersetzt werden?
Wenn ich das richtig sehe ändert sich zwischen den beiden Delphi-Versionen der Typ des Blob von String zu TBytes. Mit dem Class-Helper legst du quasi einen Wrapper darüber, der das AsBlob wieder zu einem String macht - zumindest in dem Scope des Class-Helpers. Damit kannst du deinen originalen Code so lassen, wie er in D2007 funktioniert hat:

Query.ParamByName('Param1').AsBlob := 'bla'; Du musst nur dafür sorgen, daß der Class-Helper an dieser Stelle im Scope ist, wenn du unter XE4 compilierst. Das macht natürlich auch nur dann Sinn, wenn in den Blobs immer nur Strings gespeichert werden, aber das scheint ja auch so zu sein.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

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

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen

  Alt 13. Feb 2015, 15:53
Hallo,

das meinte ich nicht, ich benutze das AsBlob auch mit binären Daten, z.B. direkt aus einem Data-Pointer,
dort meckert der Compiler auch nicht.
Er meckert nur, wenn ich einen String übergebe.


Heiko
Heiko
  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 08:09 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