之前一直以为数据库中事务的使用就是一个多条语句顺序执行的过程,如果其中一条执行出错,则回执.
后来做过一些东西,发现认识有点片面,如:当第一条语句执行完成,需要查出第一条语句的主键等,即OracleCommand对象执行的可以返回对象等等.这里面有一个连带的关系.这里就当温习一下事务,代码如下:
//新方法
public static void newTest()
{
string result = "";
//一个数据库打开的链接
OracleConnection con = null;
//要在数据库中生成的事务
OracleTransaction trans = null;
//表示针对数据库执行的SQL语句或存储过程
OracleCommand cmd = null;
try
{
//ConnectionString一般在数据类中定义,定义内容在web.config中
//public static readonly string ConnectionString = ConfigurationManager.AppSettings["OracleConnectstring"];
//使用指定的字符串实例化OracleConnection类的实例
con = new OracleConnection(ConnectionString);
//打开数据库链接
con.Open();
//在数据库中开启一个事务
trans = con.BeginTransaction();
//创建并返回一个与OracleConnection类关联的SQL语句对象
cmd = con.CreateCommand();
//设置将在其中执行SQL语句的事务
cmd.Transaction = trans;
string sql = "select newTest.Nextval from dual";
//设置针对数据库执行的SQL语句
cmd.CommandText = sql;
//返回SQL语句第一行第一列的值,如果获得返回值则使用此方法
object pid = cmd.ExecuteOracleScalar();
[如果不获得返回值,则可以直接写 cmd.ExecuteNonQuery(),此方法获得影响的行数]
sql = string.Format("insert into newTest(xh,jbsj)values({0},to_date('{1}','yyyy/mm/dd hh24:mi:ss'))",pid,DateTime.Now.ToLocalTime());
cmd.CommandText = sql
int count = cmd.ExecuteNonQuery();
[可以定义多条SQL语句,如下格式:sql="xxx"; cmd.CommandText=sql; cmd.ExecuteNonQuery();]
//提交事务
trans.Commit();
}
catch (Exception ex)
{
if (trans != null)
trans.Rollback();
result = "";
}
finally
{
if (cmd != null)
cmd.Dispose();
if (trans != null)
trans.Dispose();
if (con != null)
con.Dispose();
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果,只是单纯执行几个语句,中间不需要其它返回值的话,可以把它写成一个共用的方法.
可以把OracleCommand作为List类的泛型,把语句存入LIST中,然后顺序执行,如下:
List<OracleCommand> list = new List<OracleCommand>();
//第一条SQL语句
string updSql = "xxxx";
list.Add(oracleHelper.CreateCommand(updSql));
//第二条
string selSql = "xxxx";
//可以添加多条等等..
list.Add(oracleHelper.CreateCommand(insSQL));
//最后执行LIST中存储的SQL语句
oracleHelper.ExecuteNonQuery(list);
其中oracleHelper为自己定义的一个类,ExecuteNonQuery()为自己定义的一个方法,遍历List中的SQL语句添加到Cmd对象中,方法如下:
/// <summary>
/// 对数据库执行增删改操作
/// </summary>
/// <param name="cmdList">OracleCommand命令集合</param>
/// <returns>影响的行数</returns>
public int ExecuteNonQuery(List<OracleCommand> cmdList)
{
int count = 0;
using (OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
using (OracleTransaction tran = conn.BeginTransaction())
{
try
{
int cmdCount = cmdList.Count;
for (int i = 0; i < cmdCount; i++)
{
using (OracleCommand cmd = cmdList[i])
{
cmd.Transaction = tran;
cmd.Connection = conn;
// cmd = conn.CreateCommand;
count += cmd.ExecuteNonQuery();
}
}
tran.Commit();
}
catch (Exception e)
{
tran.Rollback();
count = 0;
parmeterList.Clear();
throw e;
}
}
conn.Close();
}
return count;
}
上面两种方式目标和步骤其实一样,留下参考.