Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   D4: Query.ParamByName('').AsBlob := '' ersetzen (https://www.delphipraxis.net/183912-d4-query-parambyname-asblob-%3D-ersetzen.html)

hoika 13. Feb 2015 08:38

Datenbank: FB • Version: 2 • Zugriff über: IBDAC

D4: Query.ParamByName('').AsBlob := '' ersetzen
 
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

hoika 13. Feb 2015 09:17

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen
 
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

Uwe Raabe 13. Feb 2015 09:44

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

Zitat von hoika (Beitrag 1289733)
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.

hoika 13. Feb 2015 12:07

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen
 
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

Jumpy 13. Feb 2015 13:06

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

Zitat von hoika (Beitrag 1289787)
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.

Uwe Raabe 13. Feb 2015 13:13

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

Zitat von hoika (Beitrag 1289787)
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:

Delphi-Quellcode:
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.

hoika 13. Feb 2015 14:53

AW: D4: Query.ParamByName('').AsBlob := '' ersetzen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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