gpt4 book ai didi

sql-server - 带有加密触发器的 TooManyRowsAffectedException

转载 作者:行者123 更新时间:2023-12-02 07:45:46 25 4
gpt4 key购买 nike

我正在使用 nHibernate 更新表中的 2 列,该表上有 3 个加密触发器。触发器不属于我所有,我无法对其进行更改,因此不幸的是我无法在其中设置 NOCOUNT ON。

是否有其他方法可以解决提交时引发的 TooManyRowsAffectedException?

更新 1

到目前为止,我解决这个问题的唯一方法是使用

绕过 .Save 例程
var query = session.CreateSQLQuery("update Orders set Notes = :Notes, Status = :Status where OrderId = :Order");
query.SetString("Notes", orderHeader.Notes);
query.SetString("Status", orderHeader.OrderStatus);
query.SetInt32("Order", orderHeader.OrderHeaderId);
query.ExecuteUpdate();

感觉很脏,不易拉伸(stretch),但不会凹陷。

最佳答案

我们在使用第三方 Sybase 数据库时也遇到了同样的问题。幸运的是,在深入研究 NHibernate 代码并与开发人员进行简短讨论后,似乎有一个不需要更改 NHibernate 的简单解决方案。 Fabio Maulo 在 this thread in the NHibernate developer group 中给出了解决方案。 .

为了为 Sybase 实现此功能,我们创建了自己的 IBatcherFactory 实现,该实现继承自 NonBatchingBatcher,并覆盖 AddToBatch() 方法以删除对提供的 IExpectation 对象上的 verifyOutcomeNonBatched() 的调用:

public class NonVerifyingBatcherFactory : IBatcherFactory
{
public virtual IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor)
{
return new NonBatchingBatcherWithoutVerification(connectionManager, interceptor);
}
}

public class NonBatchingBatcherWithoutVerification : NonBatchingBatcher
{
public NonBatchingBatcherWithoutVerification(ConnectionManager connectionManager, IInterceptor interceptor) : base(connectionManager, interceptor)
{}

public override void AddToBatch(IExpectation expectation)
{
IDbCommand cmd = CurrentCommand;
ExecuteNonQuery(cmd);
// Removed the following line
//expectation.VerifyOutcomeNonBatched(rowCount, cmd);
}
}

要对 SQL Server 执行相同的操作,您需要从 SqlClientBatchingBatcher 继承、重写 DoExectuteBatch() 并从 Expectations 对象中删除对VerifyOutcomeBatched() 的调用:

public class NonBatchingBatcherWithoutVerification : SqlClientBatchingBatcher
{
public NonBatchingBatcherWithoutVerification(ConnectionManager connectionManager, IInterceptor interceptor) : base(connectionManager, interceptor)
{}

protected override void DoExecuteBatch(IDbCommand ps)
{
log.DebugFormat("Executing batch");
CheckReaders();
Prepare(currentBatch.BatchCommand);
if (Factory.Settings.SqlStatementLogger.IsDebugEnabled)
{
Factory.Settings.SqlStatementLogger.LogBatchCommand(currentBatchCommandsLog.ToString());
currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:");
}

int rowsAffected = currentBatch.ExecuteNonQuery();

// Removed the following line
//Expectations.VerifyOutcomeBatched(totalExpectedRowsAffected, rowsAffected);

currentBatch.Dispose();
totalExpectedRowsAffected = 0;
currentBatch = new SqlClientSqlCommandSet();
}
}

现在您需要将新类注入(inject) NHibernate。我知道有两种方法可以做到这一点:

  1. 在 adonet.factory_class 配置属性中提供 IBatcherFactory 实现的名称
  2. 创建一个实现 IEmbeddedBatcherFactoryProvider 接口(interface)的自定义驱动程序

鉴于我们的项目中已经有一个自定义驱动程序来解决 Sybase 12 ANSI 字符串问题,因此可以通过简单的更改来实现接口(interface),如下所示:

public class DriverWithCustomBatcherFactory : SybaseAdoNet12ClientDriver, IEmbeddedBatcherFactoryProvider
{
public Type BatcherFactoryClass
{
get { return typeof(NonVerifyingBatcherFactory); }
}

//...other driver code for our project...
}

可以通过使用connection.driver_class配置属性提供驱动程序名称来配置驱动程序。我们想要使用 Fluent NHibernate,可以使用 Fluent 来完成,如下所示:

public class SybaseConfiguration : PersistenceConfiguration<SybaseConfiguration, SybaseConnectionStringBuilder>
{
SybaseConfiguration()
{
Driver<DriverWithCustomBatcherFactory>();
AdoNetBatchSize(1); // This is required to use our new batcher
}

/// <summary>
/// The dialect to use
/// </summary>
public static SybaseConfiguration SybaseDialect
{
get
{
return new SybaseConfiguration()
.Dialect<SybaseAdoNet12Dialect>();
}
}
}

在创建 session 工厂时,我们使用这个新类,如下所示:

var sf = Fluently.Configure()
.Database(SybaseConfiguration.SybaseDialect.ConnectionString(_connectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyEntity>())
.BuildSessionFactory();

最后,您需要将 adonet.batch_size 属性设置为 1 以确保使用新的批处理程序类。在 Fluent NHibernate 中,这是使用继承自 PersistenceConfiguration 的类中的 AdoNetBatchSize() 方法完成的(有关示例,请参阅上面的 SybaseConfiguration 类构造函数)。

关于sql-server - 带有加密触发器的 TooManyRowsAffectedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com