为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:WIN10
【CPU】:I5
【问题描述】*:执行ExecuteNonQuery的时候提示请求执行超时
楼主,问一下,你在c#中使用事务控制执行多段sql,有没有遇到在同一个事务如果执行多个插入数据的sql,第一个sql能成功执行,第二个sql就会执行报错,如果分别在不同事务里面或者不添加事务去执行都可以成功,但是放在同一个事务里面就不行了。错误提示Operation is not valid due to the current state of the object。
我们这边在验证过程发现通过下面这种方式进行处理是可以执行的,即定义一个数据库连接》用BeginTransaction()开启事务》执行sql1》执行sql2》提交事务。
DmDataAccess dmDataAccess = new DmDataAccess(SiteConfig.ConnString);
using (Dm.DmConnection connection = dmDataAccess.GetConnection())
{
var trans = connection.BeginTransaction();
using (Dm.DmCommand cmd = new Dm.DmCommand())
{
cmd.Connection = connection;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = sqlText1;
cmd.ExecuteNonQuery();
}
using (Dm.DmCommand cmd = new Dm.DmCommand())
{
cmd.Connection = connection;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = sqlText2;
cmd.ExecuteNonQuery();
}
trans.Commit();
}
但是,此方式不适用于我们公司的开发框架,我们的框架是将创建数据库连接、执行SQL、关闭数据库连接设置为一个公共方法ExecuteNonQuery, 我们公司的处理流程是:开启C#的事务控制即using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))》SQL1调用ExecuteNonQuery》SQL2调用ExecuteNonQuery》提交事务。
oracle数据库和Pg数据库都支持这种方式,但是在达梦数据库中,当SQL2调用ExecuteNonQuery方法时,虽然调用了.Open()方法,但数据库连接DmConnection的状态始终是Closed状态。
所以,达梦数据库能不能支持C#的TransactionScope来控制事务,而不是通过.BeginTransaction()。数据库版本是DM Database Server 64 V8、DB Version: 0x7000c。
结贴