最近在做一个企业的分销系统,操作数据库很频繁,出现了一个问题:就是数据插入到主表了,但是在插入从表(子表)的时候却出现了错误(连接或者数据不完整等)!
在数据库中,看的到主表的记录信息,但是却没有子表的记录信息,子表绑定DataGrid控件的时候就会报错,用了好多办法都没有今天我介绍的这中方法好~
一是保证了数据库的完整行,二是避免绑定控件时报错
首先介绍与SqlTransaction对象密切相关的SqlConnection对象方法函数...
以下详细给出了两个对象包含的三中非常有用的方法:
1、SqlConnection对象的BeginTransaction方法标记一个显式本地事务的起始点
2、SqlTransaction对象的RollBack()方法清除自事务的起点或到某个保存点所做的所有数据修改。RollBack()还释放由事务控制的资源。
3、SqlTransaction对象的Commit()方法标志一个成功事务的结束。Commit()方法使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,并释放连接占用的资源
下面就给大家一两个实例,如果各位还有比我的方法方便的还请不吝赐教哦~呵呵~
(这是我写在类里的两个方法,很简单,大家一看就懂,偶是初学者,希望能对那些和我一样初学的朋友一些帮助)
/// <summary>
/// 更新数据
/// </summary>
/// <param name="BillID"></param>
/// <param name="myDt"></param>
public void UpdataDetail(string BillID,DataTable myDt)
{
int iCount=myDt.Rows.Count;
string strSql="insert into Erp_Finance_Detail(Bill_id,Detail_resume,Amt_rmb,Detail_remark) values('"+BillID+"','{0}','{1}','{2}')";
SqlConnection myConn=new SqlConnection(ConnStr);
SqlTransaction myTrans=null;//创建一个事务对象
SqlCommand myCmd=new SqlCommand();
myConn.Open();
myTrans=myConn.BeginTransaction();//打开连接,开始执行事务
try
{
myCmd.Connection=myConn;
myCmd.Transaction=myTrans;//设置SqlCommand对象的指定事务
myCmd.CommandText="delete from Erp_Finance_Detail where Bill_id in ("+BillID+")";
myCmd.ExecuteNonQuery();
for(int i=0;i<iCount;i++)
{
myCmd.CommandText=string.Format(strSql,myDt.Rows[i]["Detail_resume"].ToString().Trim(),myDt.Rows[i]["Amt_rmb"].ToString().Trim(),myDt.Rows[i]["Detail_remark"].ToString().Trim());
myCmd.ExecuteNonQuery();
}
myTrans.Commit();//保存并提交数据库数据
}
catch
{
myTrans.Rollback();//如果发生错误,数据库的所有更改回滚到自事务开始处
throw new Exception("数据更新失败!");
}
finally
{
myTrans.Dispose();
myCmd.Dispose();
myConn.Close();
myConn.Dispose();
}
}
下面的是一个删除数据的方法
/// <summary>
/// 删除指定单号所对应的所有数据
/// </summary>
/// <param name="BillID"></param>
public void DeletBill(string BillID)
{
SqlConnection myConn=new SqlConnection(ConnStr);
SqlTransaction myTrans=null;
SqlCommand myCmd=new SqlCommand();
myConn.Open();
myTrans=myConn.BeginTransaction();//开始一个事务
try
{
myCmd.Connection=myConn;
myCmd.Transaction=myTrans;//。。。
myCmd.CommandText="delete from Erp_Inventory_transaction where Bill_id in ("+BillID+")";
myCmd.ExecuteNonQuery();
myCmd.CommandText="delete from Erp_Finance_info where Bill_id in ("+BillID+")";
myCmd.ExecuteNonQuery();
myCmd.CommandText="delete from Erp_Finance_Detail where Bill_id in ("+BillID+")";
myCmd.ExecuteNonQuery();
myTrans.Commit();//保存数据库更改
}
catch
{
myTrans.Rollback();//如果发生错误,数据回滚
throw new Exception("数据删除失败!");
}
finally
{
//释放相关资源
myTrans.Dispose();
myCmd.Dispose();
myConn.Close();
myConn.Dispose();
}
}
好了,就这么点,希望大家共同进步
最后说句养好良好的编程习惯是成功的一半!
:)