在这个应用程序中,我们有一个不经常更新的users表,我们计划在客户端缓存这个数据。 使用MAX(rowversion)值作为该特定表中数据更改的指示器是否可靠? DECLARE @latestChange TIMESTAMP = 0x0000000000030D45
IF EXISTS (
SELECT TOP (1) 1
FROM MyTable
HAVING MAX(Version) <> @latestChange ) BEGIN
SELECT 'Table has been changed, do stuff
我使用的是C#、EF和Server,几乎没有具有父-子关系的表.有两个以上,但在本例中,为了简单起见,我只使用2。
表书
Id
DateModified
RowVersion
表页
Id
BookId - this is foreign key to Book.Id
RowVersion
当任何页面/页面都是更新时,我需要更新Book中的DateModified。
我们使用RowVersion来跟踪更改,因为它是唯一的价值,我希望通过简单地执行以下操作,始终能够获得每本书的最新更改
SELECT * FROM Page
WHERE RowVersion > Book.RowVersion
很多时候,我需要将一个大表(我们称其为源)的数据移动到它的克隆(我们称其为目标)。由于它很大,所以我更喜欢upsert,而不是只删除/插入所有内容。
为了简单起见,让我们假设一个名为"id“的int PK列。
到目前为止,为了做到这一点,我使用了日期时间字段dbupddate,该字段存在于两个表中,它保存插入/更新行的最近时间。这是通过使用触发器来完成的,对于任何插入/更新操作,该触发器将dbupddate设置为getdate()。
因此,到目前为止,我的普通upsert代码看起来像这样:
update t set (col1=s.col1,col2=s.col2 etc)
from
我有这段代码,因为表名是硬编码的,所以伸缩性不好。我很感激关于如何重构它的想法。 CREATE FUNCTION [dbo].[GetIntRowVersion] (@Id INT, @Table NVARCHAR(128)) RETURNS BINARY(8) AS
BEGIN
DECLARE @rowVersion AS BINARY(8)
IF @Id = 0
SELECT @rowVersion =
CASE
WHEN @Table = 'Score' THEN (SELECT MAX([RowVersion]) FR
我有一个数据库标量函数,它从一组相关表(给定一些父ID)返回最大RowVersion。
示例:
CREATE FUNCTION [dbo].[GetMaxRowVersion](@ParentId BIGINT)
RETURNS ROWVERSION
AS
BEGIN
RETURN
(SELECT MAX(MaxRecordVersion)
FROM
(SELECT Id AS ParentId, RecordVersion AS MaxRecordVersion
FROM dbo.TableA
通常的做法是在IDENTITY之后使用@@IDENTITY变量来获取表的新创建的INSERT。
使用rowversion值以类似的方式检索UPDATE后面的最后一个值是正确的吗?
例如:
IF(OBJECT_ID('XXX') IS NOT NULL)
DROP TABLE XXX
GO
CREATE TABLE XXX
(
ID int IDENTITY(1,1) PRIMARY KEY,
Name varchar(64) NOT NULL,
RV rowversion
)
GO
INSERT INTO XXX(Name) VALUES
我正在尝试通过对RowVersion列的简单查询来使rowversion在SqLite和SqlServer上都能正常工作。为了能够做到这一点,我需要将rowversion列转换为ulong而不是byte[],这样它仍然可以正常工作。 public abstract class VersionEntity
{
public ulong RowVersion { get; set; }
}
public class Observation : VersionEntity
{
public Guid Id { get; set; }
public Guid TaskId
我使用的是没有行版本或时间戳的Sql表。但是,我需要使用Linq来更新表中的某些值。由于Linq不知道要更新哪些值,所以我使用第二个DataContext从数据库检索当前对象,并将数据库和实际对象作为附加方法的输入,如下所示:
Public Sub SaveCustomer(ByVal cust As Customer)
Using dc As New AppDataContext()
If (cust.Id > 0) Then
Dim tempCust As Customer = Nothing
Using dc
我正在创建应用程序中使用的默认并发策略。
我决定采取乐观的策略。
我的所有实体都被映射为Table per Type (TPT) (使用继承)。我很快就了解到,在实体框架上使用带有继承的RowVersion类型的列时会出现问题:
Product
Id INT IDENTITY PRIMARY KEY
RowVersion ROWVERSION
Car (inherits Product records)
Color TYNIINT NOT NULL,
AnotherProperty....
如果我更新Car表的记录,则不会更新Product表中的RowVersion列。
我计划在d
我使用的是NHibernate 3.3.3.4000和SQL Server 2012。
我搜索过如何使用代码映射(loquacious)来配置使用SQL Server时间戳(即rownumber)列的乐观并发,但没有找到这样的示例。
我还使用NHibernate的SchemaExport.Create()方法创建SQL Server数据库,因此在NHibernate创建数据库之后,映射必须在SQL Server表中产生类型为timestamp的RowVersion列。
我的DTO类是这样设置的:
public class TestDto {
public virtual Guid Id {
我使用以下SQL来创建表:
public const string dropCreate =
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'Application' AND type = 'U')
DROP TABLE [dbo].[Application]
CREATE TABLE [dbo].[Application]
我有一个关于Jqgrid行更新的问题。我们有一个数据库表,如下所示。
id :1 field1: john field2:black
假设用户想要更新第一行,其中有一个名为id=1的字段,用户双击该行并打开该行的详细信息。正如您看到的第一行,field1是john,field2是黑色。例如,如果另一个用户在第一个用户之后双击同一行并将field2更新为红色,会发生什么情况?第一个用户仍在更新屏幕上。在他的屏幕上,field2仍然是黑色的。之后,第一个用户只将field1更新为jack并保存行。结果将是field1: jack,field2 : black。因为第一个用户不知道field2的变化
在浏览SQL时,我注意到了EF4生成的以下查询。
exec sp_executesql N'declare @p int
update [dbo].[User]
set @p = 0
where (([UserID] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [dbo].[User]
where @@ROWCOUNT > 0 and [UserID] = @0',N'@0 int,@1 binary(8)',@0=1,@1=0x000000000042DDCD
我不知道为什么EF4会产生
我希望为int创建包装类,以便在我的实体中使用它(它将在许多实体中使用,因此我希望使它尽可能容易使用),并将实体框架配置为在SQL中将其视为整数(以避免创建新表以存储这些值),例如:
public class SomeEntity
{
public long Id { get; set; }
public BoundedInteger SomeProperty { get; set; }
}
public class BoundedInteger
{
public const int MAX_VALUE = 100;
public const int MIN
我们有SQL server 2017,我们希望在现有数据库中创建一个新的字段。
字段数据类型为RowVersion ,但使用Studio,我不能定义具有RowVersion数据类型的字段,我们可以使用时间戳,但据我所知,TimeStamp现在已不再推荐使用RowVersion
对此有什么建议吗?
下面是不包含行版本的DataType列表:
编辑
现在,我编写了以下脚本来创建一个具有行版本列类型的新表:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test2](
[id] [int
我有一个查询链接的SQL server 2008数据库并将该数据库中的表中的数据连接到SQL server 2000中的表的查询。它一直在使用find,直到SQL server 2008数据库中的一列被更改为varchar(max)。我收到一个错误,并通过使用CAST(varchar(max) column AS varchar(50))修复了它。现在,与更改前相比,我的查询性能变慢了。你能给我一些如何解决这个问题的建议吗?谢谢您抽时间见我。
我想要更新一个记录类型图,它在内部修改父对象和子对象。当EF更新孩子的注册表将其设置为NULL时,问题通常会发生,其中孩子帮助识别您正在更新的记录。
我的域类是:
这个类帮助我更改状态Add - Customized delete,这是从父级到所有子级的图。使其工作的函数。
public interface IObjectWthState
{
State State { get; set; }
}
public enum State
{
Added,
Unchanged,
Modified,
Deleted
}
这是一个用户类:
public abs
我引用这个例子:
引用:如果BlobDetails不是LINQ实体,那么你可以直接这样做:
var qry = from b in dc.Blobs
orderby b.RowVersion descending
select new BlobDetails {
Id = b.Id, Size = b.Size,
Signature = b.Signature, RowVersion = b.RowVersion};
return qry.ToList();
我看到他们通过ORM-tool LIN