Hat jemand Erfahrung mit SQL Server RowVersion
Spalte mit TClientDataset
? Genauer gesagt muss ich den RowVersion
Wert auf Einfügen zurückgeben. Es scheint, den RowVersion
Wert wieder auf Updates zu bekommen, aber eine neu eingefügte Zeile tut es nicht.Delphi TClientDataset SQL Server RowVersion
Antwort
Dies scheint ein ähnliches Problem einzubinden, wenn Sie eine CDS mit einer SqlServer Tabelle verwenden müssen, die ein Identitätsfeld hat, wobei der Wert in dem Feld durch den Server eingestellt ist, so dass Sie wissen, dass es nicht während der CDS-Seite einfügen Operation. Ein Weg, dies zu tun, wird in diesem Artikel http://edn.embarcadero.com/article/20847 erklärt. Es geht um einen temporären, negativen, Wert auf das Identity-Feld in den CDS im OnNewRecord
Ereignisse zuweisen, und dann mit der Refresh
Methode der CDS auf rufen Sie den serverseitige Identität Feldwert, sobald der neue Rekord wurde veröffentlicht zum Server durch den Aufruf ApplyUpdates
.
In D7, die ich für diese Antwort als eine Art kleinsten gemeinsamen Nenner verwenden, scheint diese Technik gut zu einem RowVersion-Feld zu funktionieren. Ein Auszug aus einem Beispielprojekt ist unten. Um es funktioniert, hatte ich das RowVersion Feld als ftBytes
Feld mit einer Größe von 8 zu definieren und die ProviderFlags
zu ändern pfInWhere
und pfInUpdate
vom AdoQuery Identität Feld, ID auszuschließen.
Das Feld RowVerStr
im CDS dient nur dazu, den Wert lesbar in einem TDBGrid anzuzeigen.
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSetProvider1: TDataSetProvider;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
ADOQuery1ID: TAutoIncField; // The ID field is an Identity field on the server
ADOQuery1IntValue: TIntegerField; // a user field
CDS1: TClientDataSet;
CDS1ID: TAutoIncField;
CDS1IntValue: TIntegerField;
CDS1RowVersion: TBytesField;
CDS1RowVerStr: TStringField; // just for display, fkInternalCalc, size = 20
ADOQuery1RowVersion: TBytesField;
procedure FormCreate(Sender: TObject);
procedure CDS1AfterPost(DataSet: TDataSet);
procedure CDS1AfterDelete(DataSet: TDataSet);
procedure CDS1NewRecord(DataSet: TDataSet);
procedure CDS1AfterInsert(DataSet: TDataSet);
procedure CDS1CalcFields(DataSet: TDataSet);
public
FID : Integer; // To generate temporary value for CDS identity field
function NextID : Integer;
end;
[...]
function GetRowVerString(V : Variant) : String;
var
i,
Dim,
Min,
Max : Integer;
i64 : Int64;
begin
Result := '';
if not VarIsArray(V) then Exit;
Dim := VarArrayDimCount(V);
Max := VarArrayHighBound(V, Dim);
Min := VarArrayLowBound(V, Dim);
for i := 0 to 7 do
Int64Rec(i64).Bytes[i] := V[i];
Result := IntToStr(i64);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// CDS1ID is an ftAutoInc field, so we need to remove its read-only flag so
// that we can assign it a temporary negative value in the OnNewRecord event
CDS1ID.ReadOnly := False;
AdoQuery1RowVersion.ProviderFlags := AdoQuery1RowVersion.ProviderFlags - [pfInWhere, pfInUpdate];
CDS1.Open;
Caption := IntToStr(CDS1.RecordCount);
end;
procedure TForm1.CDS1AfterPost(DataSet: TDataSet);
begin
if CDS1.ApplyUpdates(0) = 0 then
CDS1.Refresh;
end;
procedure TForm1.CDS1AfterDelete(DataSet: TDataSet);
begin
CDS1.ApplyUpdates(-1);
end;
function TForm1.NextID: Integer;
begin
Dec(FID);
Result := FID;
end;
procedure TForm1.CDS1NewRecord(DataSet: TDataSet);
begin
CDS1.FieldByName('ID').AsInteger := NextID;
CDS1.FieldByName('IntValue').AsInteger := Random(100);
end;
procedure TForm1.CDS1AfterInsert(DataSet: TDataSet);
begin
CDS1.Post;
end;
procedure TForm1.CDS1CalcFields(DataSet: TDataSet);
begin
CDS1RowVerStr.AsString := GetRowVerString(CDS1RowVersion.Value);
end;
- 1. SQL Server RowVersion
- 2. Delphi - Ist TClientDataset Thread sicher?
- 3. SQL-Abfrage auf TClientDataSet (CDS-Datei) in Delphi XE?
- 4. T-SQL "Zeitstempel" überschreibt "rowversion" Datentyp Spalte
- 5. Streaming von TClientDataSet mit Datasnap in Delphi XE6
- 6. Delphi-Datentyp für SQL Server last_user_update
- 7. Hilfe Delphi und SQL Server 2005
- 8. TClientDataSet Benutzerdefinierte Feldvergleichsfunktion
- 9. So lesen Sie eine .cds-Datenbank (TClientDataSet) mit .Net
- 10. Was passiert, wenn Timestamp (Rowversion) überläuft?
- 11. Microsoft SQL Server Management Studio sagt, dass RowVersion ungültiger Typ ist
- 12. TClientDataSet CreateDataSet Speicherverlust
- 13. TClientDataSet - SaveToStream wirft Zugriffsverletzung
- 14. Optimistische Nebenläufigkeit: IsConcurrencyToken und RowVersion
- 15. Rowversion Vergleich in Entity Framework
- 16. indy ssl delphi Server
- 17. aktuelles fokussiertes Feld eines TClientDataSet
- 18. Delphi 3 zu SQL 2008
- 19. SQL Server varchar (MAX) -Datentyp in Delphi mit RemObjects
- 20. Übergabe von NULL-Wert in parametrisierten Delphi-SQL-Server-Abfrage
- 21. Wer hat eine teilweise XSD, die den METADATA-Abschnitt von Delphi TClientDataSet-XML-Dateien beschreibt?
- 22. TClientDataset in OS X Firemonkey App
- 23. Delphi Firedac MSSQL auf andere Server kopieren
- 24. Parameter in SQL - Delphi 7
- 25. Build-Server von Delphi XE nach Delphi XE2 migrieren
- 26. Wie Einfügen von .png Bilder in TClientDataSet .cds Datei?
- 27. Get rowcount für ein gefiltertes TClientDataSet
- 28. Aggregieren eines berechneten Felds in TClientDataset
- 29. Kopieren von TClientDataSet-Inhalten mit Feldkonfigurationen
- 30. Aktuellen Zeilversion/Timestamp-Wert in Update-Anweisung erhalten - Sql Server
'rowversion' ist ein [Synonym (tatsächlich Ersatz) für' timestamp'] (https://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact -sql). – Victoria
@avidgolfer: Hat das dein Problem gelöst? – MartynA
@MartynA: Ihre Lösung funktioniert. Scheint übermäßig gesprächig, aber ich bin nicht in der Lage, es in meiner Umgebung zu implementieren, aufgrund von Beschränkungen, die außerhalb meiner Kontrolle liegen. – avidgoffer