首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法让Dapper正确处理SQL RowVersion。

Dapper是一个流行的.NET微型ORM,它可以帮助你轻松地处理数据库操作。然而,Dapper本身并不直接支持RowVersion类型,因为RowVersion是一个数据库特定的类型,通常用于乐观并发控制。

要在Dapper中处理RowVersion,你可以将其视为byte[]ulong类型。以下是一些示例,说明如何在Dapper中处理RowVersion

将RowVersion视为byte[]

  1. 从数据库读取RowVersion
代码语言:javascript
复制
using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var sql = "SELECT Id, Name, RowVersion FROM YourTable WHERE Id = @Id";
    var parameters = new { Id = 1 };

    var result = connection.QueryFirstOrDefault<dynamic>(sql, parameters);

    if (result != null)
    {
        byte[] rowVersion = (byte[])result.RowVersion;
        // 处理rowVersion
    }
}
  1. 将RowVersion更新到数据库
代码语言:javascript
复制
using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var sql = "UPDATE YourTable SET Name = @Name, RowVersion = @RowVersion WHERE Id = @Id AND RowVersion = @CurrentRowVersion";
    var parameters = new
    {
        Id = 1,
        Name = "NewName",
        CurrentRowVersion = currentRowVersion // 当前的RowVersion值
    };

    int affectedRows = connection.Execute(sql, parameters);

    if (affectedRows == 0)
    {
        // 并发冲突,RowVersion已更改
    }
}

将RowVersion视为ulong

  1. 从数据库读取RowVersion
代码语言:javascript
复制
using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var sql = "SELECT Id, Name, RowVersion FROM YourTable WHERE Id = @Id";
    var parameters = new { Id = 1 };

    var result = connection.QueryFirstOrDefault<dynamic>(sql, parameters);

    if (result != null)
    {
        ulong rowVersion = BitConverter.ToUInt64((byte[])result.RowVersion, 0);
        // 处理rowVersion
    }
}
  1. 将RowVersion更新到数据库
代码语言:javascript
复制
using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var sql = "UPDATE YourTable SET Name = @Name, RowVersion = @RowVersion WHERE Id = @Id AND RowVersion = @CurrentRowVersion";
    var parameters = new
    {
        Id = 1,
        Name = "NewName",
        CurrentRowVersion = currentRowVersion // 当前的RowVersion值
    };

    int affectedRows = connection.Execute(sql, parameters);

    if (affectedRows == 0)
    {
        // 并发冲突,RowVersion已更改
    }
}

注意事项

  • 并发控制:在使用RowVersion进行乐观并发控制时,请确保在更新操作中检查RowVersion是否匹配。如果不匹配,说明在读取和更新之间有其他事务修改了数据。
  • 类型转换:在将RowVersion从数据库读取到应用程序时,需要进行适当的类型转换。上面的示例展示了如何将其视为byte[]ulong
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET EF Core(Entity Framework Core)

2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。...EF Core会把Linq操作转换为SQL语句。面向对象,而不是面向数据库(SQL)。...SQLServer数据库可以用一个byte[]类型的属性做并发令牌属性,然后使用IsRowVersion()把这个属性设置为RowVersion类型,这样这个属性对应的数据库列就会被设置为ROWVERSION...对于ROWVERSION类型的列,在每次插入或更新行时,数据库会自动为这一行的ROWVERSION类型的列其生成新值。...总结:如果有一个确定的字段要被进行并发控制,那么使用IsConcurrencyToken()把这个字段设置为并发令牌即可;如果无法确定一个唯一的并发令牌列,那么就可以引入一个额外的属性设置为并发令牌,并且在每次更新数据的时候

23711
  • EntityFramework系列:MySql的RowVersion

    Sql Server的RowVersion生成一串唯一的二进制保证Row的版本,无关TimeStamp,更无论TimeStamp的精度问题。...使用MySql触发器只能解决uuid的插入的默认值和更新的随机值,由于MySql的自身为了防止无限递归的策略,它的触发器无法在当前表的触发器中更新当前表,所以触发器无法实现更新在SqlServer中由数据库生成的...ToString()); } } return base.SaveChanges(); } 4.检查生成的Sql...image 总结: 1.需要唯一版本号的生成支持,Sql Server(Compact)本身支持,MySql的uuid函数也支持。...2.需要设置Insert时的RowVersion默认值和更新RowVersion版本号,Sql Server(Compact)本身支持,MySql只支持不能用于RowVersion的TimeStamp的默认值和自动更新

    1.3K10

    SQL定义表(二)

    RowVersion,AutoIncrement和串行计数器字段InterSystems SQL支持三种专用数据类型,用于自动增加计数器值。...对该表的任何后续插入或更新都会为该行的RowVersion字段分配一个顺序整数。该字段是只读的;尝试修改RowVersion值会生成SQLCODE -138错误:无法为只读字段插入/更新值。...在此示例中,持久类名称Person是默认的SQL表名称。可以使用SqlTableName类关键字来提供其他SQL表名称。...请注意,诸如上图所示的持久性类定义在编译时会创建相应的表,但是无法使用SQL DDL命令(或通过使用Management Portal Drop操作)来修改或删除此表定义,这会向显示消息“未为类'schema.name...尝试编辑现有类的任何与分片相关的属性都可能导致数据无法访问。

    1.5K10

    asp.net core 系列之并发冲突

    但是,这种方法,也有一些问题: 当对同一个属性进行竞争性更改的话,无法避免数据丢失 通常不适用于web应用。它需要维持重要状态,以便跟踪所有提取值和新值。 维持大量状态可能影响应 用性能。...注意:rowversion ,  1.它是 SQL Server 特定的。 其他数据库可能无法提供类似功能。 2.用于确定从数据库提取实体后未更改实体。...如果要更新的行已经修改,则 rowversion提取值与现在数据库中rowversion的值不匹配; update 或 delete 命令不能找到行。...(); 以下代码显示更新 Department 名称时由 EF Core 生成的部分 T-SQL: SET NOCOUNT ON; UPDATE [Department] SET [Name]...如果数据库 RowVersion 不等于 RowVersion 参数( @p2 ),则不更新行。 @@ROWCOUNT 返回受上一语句影响的行数。

    1.6K20

    sql server时间戳timestamp

    我们知道数字类型有个“标识”属性,设置好“标识种子”、“标识递增量”,每增加一条记录时,这个字段的值就会在最近的一个标识值基础上自动增加,这样我们可以知道哪些记录是先添加的,哪些记录是后添加的,但是我们无法知道哪些记录修改过...Microsoft® SQL Server™ 2000 引入了 timestamp 数据类型的 rowversion 同义词。...在 DDL 语句中尽可能使用 rowversion 而不使用 timestamp。rowversion 受数据类型同义词行为的制约。有关更多信息,请参见数据类型同义词。...rowversion 数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。 一个表只能有一个 timestamp 列。...rowversion 的数据类型为 timestamp 数据类型的同义词,并具有数据类型同义词的行为。 在 DDL 语句,请尽量使用 rowversion 而不是 timestamp。

    17410

    SQL命令 UPDATE(三)

    这个系统范围的锁阈值是可配置的: 使用$SYSTEM.SQL.Util.SetOption("LockThreshold")方法。 通过管理门户。 进入系统管理,配置,SQL和对象设置,SQL。...但是,如果执行的更新数量如此之多,以致出现错误,UPDATE将发出SQLCODE -110错误 计数器递增 ROWVERSION SERIAL (%Counter) ROWVERSION...计数器增量 如果一个表有一个数据类型为ROWVERSION的字段,那么对一行执行更新将自动更新该字段的整数值。...ROWVERSION字段接受来自名称空间范围的行版本计数器的下一个顺序整数。 试图指定ROWVERSION字段的更新值将导致SQLCODE -138错误。...尝试更新具有列级ReadOnly (SELECT或REFERENCES)权限的字段的值(即使是NULL值)将导致SQLCODE -138错误:无法为只读字段插入/更新值。

    1.6K20

    SQL命令 INSERT(二)

    这是一种压缩的二进制格式,不会映射到 SQL的相应本机数据类型。它对应于默认MAXLEN为32749的数据类型VARBINARY。...因此,动态SQL不能使用INSERT或UPDATE来设置%LIST类型的属性值。 插入计数器值 表可以有选择地将一个字段定义为Identity。...表可以选择将一个字段定义为数据类型ROWVERSION。如果定义了该字段,插入操作会自动将命名空间范围的RowVersion计数器中的整数插入到该字段中。...更新操作使用当前命名空间范围的RowVersion计数器值自动更新此整数。不能为ROWVERSION字段插入用户指定的值、计算的值或默认值。此计数器无法重置。...这些字段包括RowID、可选的标识字段、序列号(%Counter)字段和ROWVERSION字段。

    3.3K20

    Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装

    前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装。 Dapper的用法比较接近ADO.NET所以性能也是比较快。...这个写的比较简单,如果有复杂的sql可能就支持不了了。...原生封装 dapper框架是给IDBConnection写了一些扩展方法,底层还是反射实现对象的关系映射。...封装 } } } ◆ 三、Dapper的二次封装(基于上一个) 利用反射对Dapper进行二次封装:DapperSuperHelper.cs,通过继承继承dapper的封装,我们可以即可用使用原始封装又可以使用通用的对单表的增删改查...注意:修改的时候建议先查出数据再执行修改,因为目前封装的代码无法实现只更改某个字段,暂时是全部更改,必填项必须有值。非必填,不传值,即为null。

    2.9K30

    .NET Core中使用Dapper操作Oracle存储过程最佳实践

    Dapper的DynamicParameters不支持游标类型 如果你用Dapper来进行Oracle的存储过程的操作,刚好这个存储过程需要传入一个游标类型的输出值,如下所示,你会发现在DbType中是不包含游标类型的...操作Oracle的文章,没有印象的可以点击链接查看下[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了。...同时,作者也发布了Nuget包,来你远离996.使用方式如下: ? 然后在文件中引入Dapper.Oracle的明明空间就可以了。...同时此项目的GitHub地址有必要贴一下:https://github.com/DIPSAS/Dapper.Oracle 正如作者所说:此程序集添加了对编写Oracle特定SQL的支持,该SQL支持Oracle...使用此包,现在可以运行返回refcursor的存储过程,或者使用数组绑定计数来执行带有参数数组的SQL语句。

    1.2K50

    ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    甚至关于ASP.NET Core Web API中使用Dapper+Mysql组合的文章都很少,更别提Oracel+Dapper组合的文章了,那么今天就带着大家一起翻译一篇国外大牛写的关于ASP.NET...注:虽然本文内容是翻译,但是楼主刚在2.1环境是使用成功,中间也没有任何阻碍,只是鉴于本人电脑配置太差无法安装Oracle数据库,所以无法进行演示,再者是表示对原作者的尊重,所以在这里只是对原作内容进行翻译然后加上自己的理解稍作改动...首先,在这里,我们不使用SQL ,因为互联网上已有很多文章都是使用SQL Server进行演示的。所以,我想写一篇使用Oracle作为数据库的文章。...Oracle SQL Developer是一个免费的集成开发环境,可简化传统和云部署中Oracle数据库的开发和管理。...SQL Developer提供完整的PL / SQL应用程序端到端开发,运行查询和脚本的工作表,用于管理数据库的DBA控制台,报告界面,完整的数据建模解决方案以及用于迁移第三方数据到Oracle的平台。

    1.8K10

    C#开源、简单易用的Dapper扩展类库 - Dommel

    前言今天大姚给大家分享一个C#开源(MIT License)、免费、简单易用的Dapper扩展类库,帮助.NET开发者使用Dapper的CRUD操作变得更简单:Dommel。...Dommel 能够根据你的 POCO 实体自动生成相应的 SQL 查询语句。这大大减少了手动编写 SQL 代码的工作量,并提高了代码的可读性和可维护性。...Dommel 支持 LINQ 表达式,这些表达式会被翻译成 SQL 表达式并执行。这使得开发者能够使用更高级、更灵活的查询语法。Dommel 使用 Dapper 作为底层库来执行查询和对象映射。...Dapper通过扩展IDbConnection提供一些有用的扩展方法去查询您的数据库。...坑已挖,欢迎大家踊跃提交PR推荐或自荐(优秀的项目和框架不被埋没)。

    14500

    .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/10024091.html Dapper是什么 Dapper是.NET下一个轻量级的ORM框架,它和Entity...Dapper通过扩展你的IDbConnection来进行工作的。如果你想了解更多内容的话请点击这里。...Dapper快速入门 前面几篇文章我们进行介绍的时候都是手动在代码里面创建的模拟数据,这篇文章我们就结合Dapper来从数据库进行相关的操作。...关联查询,Dapper的强大之处就在于其关联查询了!...总结 本文给大家演示了Dapper的常用方法,不过都是通过同步的方式进行操作的,如果你想使用异步的话可以自行进行测试。文中的大部分内容都有截图,个别调试无法截图的大伙可以自行调试查看!

    1.6K00

    SQLite加密新姿势,你知道吗?

    SQLite是一个C语言实现的小型、快速、自包含、高可靠性、功能全面的SQL数据库引擎。...没错···SQlite开源版本的加密是收费的···购买需要2000$····· “贫穷我另谋出路 ” 曲线救国 :Microsoft.Data.Sqlite 经过资料查询,发现微软的Microsoft.Data.Sqlite...个人比较喜欢Dapper,不喜欢的小伙伴可以使用自己的ORM,不用安装这个,使用自己喜欢的方式创建表即可。...Install-Package Dapper.Crud 安装完成后使用如下代码 using System; using System.Data; using Dapper; using Microsoft.Data.Sqlite...这里有个需要注意的点: “在设置密码创建数据库后,需要使用ORM执行sql创建表,如果是空数据库,是未加密的··可以直接打开。原因暂未可知。

    6.5K20

    .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/10024091.html Dapper是什么 Dapper是.NET下一个轻量级的ORM框架,它和Entity...Dapper通过扩展你的IDbConnection来进行工作的。如果你想了解更多内容的话请点击这里。...Dapper快速入门 前面几篇文章我们进行介绍的时候都是手动在代码里面创建的模拟数据,这篇文章我们就结合Dapper来从数据库进行相关的操作。...关联查询,Dapper的强大之处就在于其关联查询了!...总结 本文给大家演示了Dapper的常用方法,不过都是通过同步的方式进行操作的,如果你想使用异步的话可以自行进行测试。文中的大部分内容都有截图,个别调试无法截图的大伙可以自行调试查看!

    1.1K30

    AOT使用经验总结

    这使得应用部署更便捷,能适应更多老旧系统环境,为开发者拓展了应用场景,在性能提升的同时,也增加了系统兼容性,.NET应用的开发和部署更具灵活性和广泛性,给用户带来更好的体验。...Dapper支持Dapper的AOT支持需要安装Dapper.AOT包,rd.xml添加如下内容:<assembly...nameof(JsonPrettifyEntity.IndentSize)} INTEGER )"; using var command = new SqliteCommand(sql...Windows 7支持如遇AOT后无法在Windows 7运行,请添加YY-Thunks包:<PackageReference Include="YY-Thunks" Version="1.1.4-Beta3...希望以上总结的经验能对大家在 AOT 使用过程中有所帮助,<em>让</em>大家在开发过程中少走弯路,提高项目的开发效率和质量。同时,也期待大家在实践中不断探索和总结,共同推动技术的进步和发展。

    7110

    用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

    很快发现,烦心的不止这个Content内容字段,如果要做到SQL那么灵活,要让系统更加高效,有很多地方实体类都不需要完整映射一个表的,一个表被影射出3-4个实体类是常见的事情,这系统的实体类数量迅速膨胀...但是,LINQ to SQL是一个不再更新的技术。其有很多不足之处,如,不能灵活的定义对象模型与数据表之间的映射、无法扩展提供程序只能支持SQL Server等。...SQL来的好;而对于复杂查询效率低的问题,这个跟ORM没有太大关系,复杂查询哪怕用SQL写,DB执行起来也低的,ORM只不过自动生成SQLDB去执行而已,问题可能出在某些ORM框架输出的SQL并不是开发人员预期的...Dapper,身手敏捷,兼有SQL的灵活与ORM的强大,加之它是外国的月亮,用的人越来越多,有点要把EF比下去的架势,如日中天了!...感谢所有已经捐助过和关心PDF.NET的朋友,期望他们的爱心能够更多的人知晓并赞扬!

    4.1K90
    领券