为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:达梦8
【操作系统】:windows
【CPU】:
【问题描述】*:
c#连接达梦数据库,报错:Operation is not valid due to the current state of the object.
在同一个事务中执行多个插入sql时,第一个sql能够执行通过,第二个语句就会报如上错误
如果在不同事务里面执行不会报错,或者不在事务里面执行也不会报错。
相同的语句在ORACLE中执行没有问题。
所以这个结果是什么呢?技术支持不能公开回复么?
请问怎么解决的
感谢楼主帮助登记问题,我这边再补充一下验证情况,也已经反馈给客服了。
我们这边在验证过程发现通过下面这种方式进行处理是可以执行的,即定义一个数据库连接》用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();
}
但是,此方式不适用于我们公司的开发框架,我们的框架是将创建数据库连接、执行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。