Microsoft Sync Framework clashes with Nhibernate TooManyRowsAffectedexception

后端 未结 1 544
后悔当初
后悔当初 2021-01-05 19:12

We are trying to implement the Microsoft Sync Framework into our application that persists it\'s domain using NHibernate.

One of the problems we encountered is that

相关标签:
1条回答
  • 2021-01-05 20:08

    I think the NOCOUNT way is the way to go. You could do this by setting the NOCOUNT for all tables used by the sync framework. See the code below. Another way is to patch NHibernate and ignore the updatecount see (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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题