2016-04-20 17 views
0

Nach dem DelphiXE2 nach Delphi Seattle 10 Update zu aktualisieren 1 haben wir Probleme Ausführung TClientDataSetApplyUpdates Anrufe, wenn die SQLDirect components Version 6.4.5TClientDataset.ApplyUpdates nicht mit ‚SQL nicht unterstützt‘, wenn SQLDirect Komponenten

mit machte ich eine kleine Test-App
Komponenten: TDBGrid -> TDataSource -> TClientDataSet -> TDataSetProvider -> TSDQuery -> TSDDatabase
Abfrage ist select * from tt_plan_task, Provider hat UpdateMode=upWhereAll, ClientDataset hat IndexFieldName=tt_plan_task_id.
Wir ändern einen Wert für das Feld tt_plan_task.tt_prj.

Wenn ApplyUpdates(0) Ausführung zeichnet der Code in TSQLResolver.InternalDoUpdate in DataSnap.Provider (für UpdateKind=ukModify).
Dort sehen das generierte SQL und die Parameter wie erwartet aus.
Der Code springt dann auf

procedure TSQLResolver.DoExecSQL(SQL: TStringList; Params: TParams); 
var 
    RowsAffected: Integer; 
begin 
    RowsAffected := (Provider.DataSet as IProviderSupportNG).PSExecuteStatement(SQL.Text, Params); 

Diese Aussage Abstürze mit Fehler SQL not supported (SProviderSQLNotSupported in Data.DBConsts)

aber da dieses eine Schnittstelle, kann ich nicht weiter verfolgen.
Ich weiß nicht, wie ich hier vorgehen soll, um das Problem zu lösen. Irgendwelche Vorschläge wie oder was könnte los sein?

Zusätzliche Informationen:

  • SELECT und (parametrisierte) UPDATE-Abfragen durch eine TSDQuery Komponente funktioniert Ausführen.
  • eine ClientDataSet mit allen FireDac Komponenten (TDBGrid -> TDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery -> TDFConnection) (verschiedene testapp) arbeitet
  • Fein
  • Diese mit Datenbank-Dialekt 3
  • Firebird-Version eine Firebird-Datenbank ist 2.5.3.26778
  • Delphi 10 ohne die Interbase installiert wurde Komponenten
  • Dies ist alles in einer Win7 VM, wo Delphi XE2 entfernt wurde (alles "Borland/CodeGear/Embarcadero" gereinigt), und Seattle installiert. Mein Kollege hat ähnliche Probleme mit einer sauberen Seattle-Installation in einer sauberen Win10-VM.
  • Apps und Firebird Win32 sind, OSes Win64 sind

[Hinweis: Selbst der Beantwortung dieser Frage, weil es mich einige Zeit ganz nahm dies herauszufinden. Es kann anderen helfen.]

Antwort

0

Wenn Googling the error message Ich stolperte über diesen Beitrag SProviderSQLNotSupported on DOA with Delphi XE3, wo ein Benutzer ähnliche Probleme mit Oracle Direct Access hatte.
Es schlägt entweder vor:

1) Set TDataSetProvider.ResolveToDataSet=true auf Kosten der Leistung. Dies funktioniert in der Test App.

function TDataSet.PSExecuteStatement(const ASQL: string; AParams: TParams): Integer; 
begin 
    Result := 0; 
    DatabaseError(SProviderSQLNotSupported, Self); 
end; 

Die zweite Situation ist, was passiert:

2) Die PSExecuteStatement kann nicht (außer Kraft gesetzt) ​​in der 3rd-Party-Software, und seine Basis Verfahren von data.db Tritten in realisiert werden. Der SQLDirect Code macht für die TSDDataSet Methode eine Überschreibung haben

function PSExecuteStatement(const ASQL: string; AParams: TParams; {$IFDEF SD_CLR} var ResultSet: TObject {$ELSE} {$IFDEF SD_VCL17} var ResultSet: TDataSet {$ELSE} ResultSet: TSDPtr = nil {$ENDIF} {$ENDIF}): Integer; overload; override; 

die unter Delphi Seattle löst/kompiliert außer Kraft zu setzen:

function PSExecuteStatement(const ASQL: string; AParams: TParams; var ResultSet: TDataSet): Integer; overload; override; 

aber es gibt keine für

function TDataSet.PSExecuteStatement(const ASQL: string; AParams: TParams): Integer; 

Die Lösung ist Hinzufügen eines:

Aktualisieren Sie in den geschützten Methoden für TSDDateSet in SDEngine.pas wie folgt:

function PSExecuteStatement(const ASQL: string; AParams: TParams): Integer; overload; override; // New override 
function PSExecuteStatement(const ASQL: string; AParams: TParams; {$IFDEF SD_CLR} var ResultSet: TObject {$ELSE} {$IFDEF SD_VCL17} var ResultSet: TDataSet {$ELSE} ResultSet: TSDPtr = nil {$ENDIF} {$ENDIF}): Integer; overload; override; 

mit Umsetzung:

function TSDDataSet.PSExecuteStatement(const ASQL: string; AParams: TParams): Integer; // JD 20-4-2016 
var 
    ds: TDataSet; 
begin 
    ds := nil; 
    Result := InternalPSExecuteStatement(ASQL, AParams, false, ds); 
end; 
0

hatte ich ein ähnliches Problem von Delphi 2009 nach Seattle migrading 10, auf TAsaDataSet + TDataSetProvider + TClientDataSet wir das Problem gelöst, ein paar Eigenschaften zu ändern:

AsaDataSet.readyOnly := true; 
DataSetProvider.ResolveToDataSet := True; 

dann haben wir an einem gewissen Punkt unseres Codes sichergestellt, dass das TAsaDataSet es zu seiner Tabelle fähig ist.

TAsaDataSet .Close; 
TAsaDataSet .Session := DmConection.AsaConnection; 
TAsaDataSet .SQL.Text := 'SELECT * FROM dba.table_name'; 
TAsaDataSet .Open; 

Wir bemerken auch ab 2009 die Methode Signatur seatle OnGetTableName aus: (Sender: TObject; DataSet: TDataSet; var TableName: WideString); zu: (Sender: TObject; DataSet: TDataSet; var TableName: string);

Hoffnung irgendwie ist es Ihnen hilft.

Verwandte Themen