最近在做一个数据库通用读写程序时发现Oracle的事务回滚仅对DML语句有效,而对于一个由DDL语句组成的事务过程,每一个操作都会自动提交,不会从出错处回滚。下面是一个基于.NET的Oracle驱动用C#写的执行非查询SQL语句的方法:
代码
public int GetNonQueryExecCount(string[] pSqls)
{
int count = 0;
try
{
using (TransactionScope tranScope = new TransactionScope())
{
DbCommand dbCommand = m_oraConn.CreateCommand();
lock (m_oraConn)
{
this.Open();
for (int i = 0; i < pSqls.Length; i++)
{
dbCommand.CommandText = pSqls[i];
count += dbCommand.ExecuteNonQuery();
}
tranScope.Complete();
return count;
}
}
}
catch (Exception e)
{
throw e;
}
finally
{
this.Close();
}
}
每成功执行一条DML语句,count会自动加1,而成功执行一条DDL语句,count不变。由于这样的特性,对于DDL语句的处理,我认为不需要采用事务机制,对于每条语句直接调用下面的方法即可。
代码
public bool ExecDDL(string pSql)
{
try
{
DbCommand dbCommand = m_oraConn.CreateCommand();
this.Open();
dbCommand.CommandText = pSql;
dbCommand.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
return false;
}
finally
{
this.Close();
}