Microsoft Sync Framework 与 Nhibernate TooManyRowsAffectedException 冲突

2023-11-23

我们正在尝试将 Microsoft Sync Framework 实现到我们的应用程序中,使用 NHibernate 保留其域。

我们遇到的问题之一是,在 Sync Framework 更改了您的初始数据库结构(添加影子表和触发器)后,当您尝试将对象插入数据库时​​,NHibernate 似乎会抛出 ToomanyrowsaffectedException ,从而感到不安。

我发现这篇文章有在每个更新语句周围添加 SET NOCOUNT ON 和 OFF 的解决方案,但由于表结构是由 nhibernate 自动生成的,并且同步触发器是由同步框架自动生成的,因此手动调整所有触发器并不是真正的选择。

http://www.codewrecks.com/blog/index.php/2009/03/25/nhibernate-and-toomanyrowsaffectedexception/

我尝试按照此问题所述设置 sql server 2008 属性 NOCOUNT:哪里是设置 NOCOUNT 的最佳位置?但这导致了 StaleStateException(受影响的行数为 -1,预期为 1)。

你们知道是否有一种方法可以配置同步框架以自动在其触发器中设置这些 NOCOUNT 语句?或者也许有办法告诉 NHibernate 期望更多/更少的行被更改? 或者也许你们中的任何人都有一个自动脚本来将这些 NOCOUNT 语句添加到同步框架的触发器中。

提前谢谢!


我认为 NOCOUNT 方式是正确的选择。您可以通过为同步框架使用的所有表设置 NOCOUNT 来完成此操作。请参阅下面的代码。另一种方法是修补 NHibernate 并忽略 updatecount 请参阅(https://nhibernate.jira.com/browse/NH-1353).

KR,

Paul

    class SqlSyncTriggerHelper
{
    private const string triggerSql = @"select sys.triggers.name from sys.triggers, sys.objects
        where sys.objects.name='{0}' and sys.objects.type = 'U' and sys.triggers.parent_id = sys.objects.object_id";

    private DbSyncScopeDescription syncScopeDescription;

    public SqlSyncTriggerHelper(DbSyncScopeDescription syncScopeDescription)
    {
        this.syncScopeDescription = syncScopeDescription;
    }

    public void Apply(SqlConnection conn)
    {
        SqlTransaction transaction = null;
        try
        {
            if (conn.State == System.Data.ConnectionState.Closed)
            {
                conn.Open();
            }
            transaction = conn.BeginTransaction();
            foreach (var table in syncScopeDescription.Tables)
            {
                foreach (string trigger in GetTriggers(table.UnquotedLocalName, conn, transaction))
                {
                    AlterTrigger(trigger, conn, transaction);
                }
            }
            transaction.Commit();
        }
        catch
        {
            if (transaction != null)
            {
                transaction.Rollback();
            }
            throw;
        }
        finally
        {
            if (transaction != null)
            {
                transaction.Dispose();
            }
            conn.Close();
        }
    }

    private void AlterTrigger(string trigger, SqlConnection conn, SqlTransaction transaction)
    {
        SqlCommand newCmd = new SqlCommand(string.Format("exec sp_helptext '{0}'", trigger), conn, transaction);
        var triggerStringBuilder = new StringBuilder();
        using (var reader = newCmd.ExecuteReader())
        {
            while (reader.Read())
            {
                triggerStringBuilder.Append(reader.GetValue(0) as string);
            }
        }
        var triggerString = triggerStringBuilder.ToString();
        triggerString = triggerString.Replace("CREATE TRIGGER", "ALTER TRIGGER").Replace(" AS\n", " AS\nSET NOCOUNT ON\n") + "\nSET NOCOUNT OFF";
        var alterTriggerCommand = new SqlCommand(triggerString, conn, transaction);
        alterTriggerCommand.ExecuteNonQuery();
    }

    private IEnumerable<string> GetTriggers(string tableName, SqlConnection conn, SqlTransaction transaction)
    {
        var resultList = new List<string>();
        var command = new SqlCommand(string.Format(triggerSql, tableName), conn, transaction);
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                resultList.Add(reader.GetString(0));
            }
        }
        return resultList;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft Sync Framework 与 Nhibernate TooManyRowsAffectedException 冲突 的相关文章

  • 多个源文件中包含包含“const”的头文件

    Why does not包含定义的头文件const并被多个源文件包含会产生编译错误multiple definition const in header file h const int num 5 int x Error Multiple
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 从空白启动时 VSTO 功能区不显示解决方案

    如果我从 文件 新建项目 菜单创建一个新的 Excel 2013 和 2016 VSTO 加载项 项目 然后单击 项目 添加新项目 gt 功能区 可视化设计器 则一切正常 我启动了应用程序 我的功能区显示在 Excel 中 但是 如果我首先
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 使用32位应用程序获取syswow64目录

    我正在尝试在系统目录中查找文件 问题是当使用 Environment SystemDirectory 在 x64 计算机上 我仍然获得 System32 目录 而不是 Systemwow64 目录 我需要在 x86 机器上获取 System
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 为什么 MISRA:2012 需要函数原型?

    我想知道为什么 MISRA 2012 需要函数原型 在下面的示例中 这两个原型并不是真正必要的 include
  • #define, #ifdef #undef #endif

    我有以下代码 define PROC ADD void main void while 1 ifdef PROC ADD Do this code here then undefined it to run the code in the
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 为什么C#不支持多重继承? [复制]

    这个问题在这里已经有答案了 可能的重复 C 应该包含多重继承吗 https stackoverflow com questions 191691 should c include multiple inheritance 为什么C 不支持多
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • 中继命令和无参数执行方法

    我目前正在学习 WPF 和 MVVM 我想我已经了解了大部分内容及其工作原理 但我在使用 RelayCommand 或 DelegateCommand 时遇到了一些我不明白的问题 我认为这与代表的工作方式有关 请注意 下面的代码目前仅处于测

随机推荐

  • 如果 WebAppContext 启动失败,如何取消启动或关闭 jetty

    我正在使用 Maven Jetty 插件 如果任何 bean 失败 有没有办法阻止服务器启动或关闭 例如使用 maven jetty plugin 这是一个例子 2013 04 22 11 43 59 327 WARN oejw WebAp
  • Python中通过套接字发送和接收对象

    我在互联网上搜索了很多 但我还没有找到通过套接字发送对象并按原样接收它的解决方案 我知道它需要酸洗 我已经完成了 另一方面 它将其转换为字节并被接收 但是如何将这些字节转换为该类型的对象呢 process time data current
  • Homebrew 升级后 Jupyter Notebook 模块出现错误

    我已经使用 Jupyter 一段时间了 它运行得很好 我通过 Homebrew 安装了 Jupyter 和 Python 我在 MacOS 上运行 昨天 我运行了命令brew upgrade现在我的 Jupyter 笔记本无法找到任何已安装
  • JavaFX - SplitPane、调整大小和比例

    如何实现整个 SplitPane 的按比例调整大小 public class JfxSplitPaneTest extends Application Override public void start Stage stage throw
  • Ubuntu 14.04 - pm2 启动后重新启动后未启动

    我正在使用 pm2 启动 node js 进程 我希望在系统 Intel Atom 处理器上的 Ubuntu 14 04 启动时自动启动该进程 我已按照以下说明进行操作pm2 网站但没有成功 我的 dump pm2 似乎是正确的 但 pm2
  • 如何获取.Net Core中进程的CPU使用率和虚拟内存?

    在 NET Core中 如何获取给定进程的CPU使用率和虚拟内存 Google 搜索结果显示 PerformanceCounter 和 DriverInfo 类可以完成这项工作 但是 PerformanceCounter 和 DriverI
  • 宏不允许定义词法变量

    此代码使用 实验性 宏 use experimental macros macro new var quasi my a 42 new var say a 失败与Variable a is not declared 尽管宏通过时没有错误 如
  • 将数据库结果添加到数组

    我现在脑子一片空白 一辈子也想不出解决办法 我的场景是使用 PHP 和 MySQL 进行编程 我有一个数据库表返回特定 orderid 的结果 该查询可以为每个订单最多返回 4 行 最少返回 1 行 这是我想要如何返回结果的图像 替代文本
  • 我可以对 JScript (.js) 或 VBScript (.vbs) 文件进行数字签名吗?

    我知道可以签署 Windowsbinary可执行文件使用signtool 所以一直以来我都假设人们无法签署由Windows Script Host 例如 JScript js 或 VBScript vbs 因为它们只是文本文件 但今天 在打
  • 使用 preg_match 查找所有 PHP 变量

    如何找到所有 PHP 变量preg match 我制作了以下正则表达式 string Hallo var blabla var iam a var varvarvar gfg djf jdfgjh fd variable instring
  • 使用 Swift 制作可点击的 UILabel

    我想将特定单词设置为可点击UILabel使用 Swift 编写文本 是否可以 如果这里有多个标签 我如何检测按下的是哪个单词 你不能用简单的标签来做 github上有可用的库 https github com TTTAttributedLa
  • 如何检查时间偏移是否处于夏令时?

    我使用的 CMS 允许我访问用户相对于 UTC GMT 时间的时间偏移 因此 如果用户将时区设置为 EST 则此偏移量将为 5 当我需要显示当前时间时 我现在正在做的事情是这样的 date M j Y h i A time offset 3
  • 如何确定 iOS 上的设置何时更改

    我使用标准创建了一个自定义 Settings app 捆绑包root plistiPhone 的方法 我想知道是否有一种方法可以确定用户何时更改我的应用程序中的这些设置 您可以使用以下命令监听 NSUSerDefaults DidChang
  • 如何更改特定元素(而不是全局元素)的 TextBox 占位符文本颜色

    MSDN 列出了TextBox class here 我可以通过创建一个来覆盖这些主题资源ResourceDictionary in App xaml像这样
  • 从 Angular 5 升级到 Angular 7 后,找不到“AppModule”的 NgModule 元数据

    我们的开发团队最近将 Angular 5 项目更新为 Angular 7 我已经下载了该存储库并且正在尝试构建源代码 但是当我运行ng build命令我得到一个找不到 AppModule 的 NgModule 元数据时出现错误 如果我运行n
  • 将焦点转移到特定领域

    我有一个按钮 可以在页面上添加显示表单 单击该按钮时如何将焦点移动到表单的第一个字段 简单的例子 HTML
  • 保存和恢复 shell 变量

    我有两个 shell 脚本 我想从 C 程序调用它们 我希望第一个脚本中设置的 shell 变量在第二个脚本中可见 它看起来像这样 a sh var blah
  • C++ 创建数组

    为什么我不能做这样的事情 int size menu size int list size 有没有办法不使用向量来解决这个问题 数组更快 所以我想使用数组 thanks 大小必须在编译时已知 因为编译器需要知道多少堆栈空间需要为其分配足够的
  • 获取系统 ping 的输出而不打印到控制台

    我想打电话ping从 Python 中获取输出 我尝试了以下方法 response os system ping c 但是 这会打印到控制台 这是我不想要的 PING 10 10 0 100 10 10 0 100 56 86 bytes
  • Microsoft Sync Framework 与 Nhibernate TooManyRowsAffectedException 冲突

    我们正在尝试将 Microsoft Sync Framework 实现到我们的应用程序中 使用 NHibernate 保留其域 我们遇到的问题之一是 在 Sync Framework 更改了您的初始数据库结构 添加影子表和触发器 后 当您尝