有没有人有使用SQL Server的RowVersion
列与TClientDataset
?具体来说,我需要重新插入RowVersion
值。它似乎得到更新的RowVersion
值,但它没有新插入的行。Delphi TClientDataset SQL Server RowVersion
0
A
回答
3
这似乎涉及了类似的问题,当你需要使用CDS与 它有一个标识字段,其中在现场 值由服务器设置一个SQLServer表,所以你不知道在CDS侧插入操作期间。一种方法是在本文中解释 http://edn.embarcadero.com/article/20847。它涉及 在CDS 在OnNewRecord
事件分配一个临时的,消极的,价值的标识字段,然后使用CDS的Refresh
方法 检索服务器端的标识字段值,一旦新的纪录一直 发布致电ApplyUpdates
致服务器。
在D7中,我正在将此答案用作最低公分母, 此技术似乎也适用于RowVersion字段。下面是一个示例项目的 摘录。得到它的工作,我必须定义 的RowVersion字段大小为8的ftBytes
领域,改变 的ProviderFlags
从 AdoQuery的身份字段,ID排除pfInWhere
和pfInUpdate
。
CDS中的RowVerStr
字段仅显示在TDBGrid中的值。
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 and order
- 2. Windows Phone 7 SQL Server CE rowversion
- 3. Delphi livebinding TClientDataSet TStringGrid运行时
- 4. Delphi TClientDataSet找到问题
- 5. 在SQL Server上计算rowversion列时
- 6. rowversion in SQL Azure
- 7. Delphi XE中的TClientDataSet(CDS文件)上的SQL查询?
- 8. Delphi TClientDataSet排序(插入)问题
- 9. delphi使用SQL Server与WMI
- 10. RowVersion和Performance
- 11. SQL Server:Oracle中的RowVersion等效
- 12. MySQL是否具有与SQL Server rowversion等效的功能?
- 13. 在更新语句中获取最新的rowversion/timestamp值 - SQL Server
- 14. Microsoft SQL Server Management Studio说RowVersion是无效类型
- 15. 如何在SQL Server视图中使用TClientDataSet? (或替代)
- 16. TClientDataset - XML映射
- 17. 使用Delphi和dbExpress连接到SQL Server
- 18. Delphi XE和SQL Server 2008快速连接
- 19. 用于Delphi和C的SQL Server层#
- 20. sql server 2005 delphi 2010 dbexpress连接
- 21. 添加字段,以克隆的TClientdataSet在DELPHI
- 22. 如何按指定的顺序应用Delphi TClientDataset的更新?
- 23. Delphi:使用TClientDataset作为内存数据集
- 24. ServiceStack Ormlite和RowVersion支持
- 25. SecurityStamp vs RowVersion
- 26. 如何在已有rowversion列的表中存储rowversion值?
- 27. 的TClientdataSet和大插入
- 28. 实体框架6 mysql rowversion
- 29. T-SQL “时间戳” 覆盖 “rowversion” 数据类型列
- 30. TClientDataSet中“数据包不匹配”错误
'rowversion'是[用于'timestamp'同义词(实际上替换)](https://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact -SQL)。 – Victoria
@avidgolfer:这是否解决了您的问题? – MartynA
@MartynA:您的解决方案确实有效。看起来过于健谈,但由于我无法控制的限制,我无法在自己的环境中实现它。 – avidgoffer