使用DbHelperSQL帮助类,怎么实现数据库事务

bacely 2008-10-16 07:58:19
我以前一直是先写一个父类,再写一个子类,然后再写DAL层....DAL层的每一个类都继承那个子类,,这样,可以实现数据库事务

可现在我看大家都在用SQL帮助类,看了看帮助类,确实挺好用.....

帮助类里有两个实现了数据库事务的方法:分别是
public static int ExecuteSqlTran(List<String> SQLStringList)
public static void ExecuteSqlTran(Hashtable SQLStringList)

两个方法....但是我在做东西的时候发现不能够这么做....


比如:我要插入多条记录到一个表,而这个表中的主键正好是另外一个表的外健,这时,当插入一条记录的时候,需要插入另外多条记录到另外一个表....晕...怕看不懂,举列说明吧:

需要插入的数据记录:

表一:
PID fied1 fied2 fied3
1 0 1 1
2 0 2 1
3 0 2 2
4 0 3 1


表二:

SID PID fied1
1 1 a
2 1 b
3 1 c
4 2 a
5 2 b
6 3 a
7 4 a

先举两个表的吧.....

我想这两个表必须同时更新才能算是成功的,否则任何一条记录的插入或更新错误,则数据库须回滚事务.

首先,须要将表一的第一条记录取出(声明:保存之前是不知道PID的),然后向数据库提交保存,获得PID值.这一步帮助类能够做到,可就是没有事务...

然后根据PID值,再将表二中的相关记录取出,更新PID值,再将符合条件的记录保存到数据库.....

这是需求,不知道哪位知道怎么整....



另外:在DAL层,每个表都有一个DAL类,其中的方法是向数据库的保存\更新\删除方法,没有使用到事务...

可在进行多表操作记录时,就需要事务了,,,如果使用帮助类是远远够的,不知道怎么改....请大家帮助啊!!!!!!
...全文
439 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bacely 2008-10-16
  • 打赏
  • 举报
回复
呵呵...其实我的要求很简单...哈哈...

估计我想我已经自己解决了..



private void Submit()
{
// 声明定义事务
using (TransactionScope ts = new TransactionScope())
{
try
{
// 事务方法体
Sub1();
Sub2();

// 提交事务并回滚
ts.Complete();
}
catch
{ }
}

this.GvBind();
}

private static void Sub2()
{
DbHelperSQL.ExecuteSql("INSERT INTO Items(Item) VALUES(''aa'')");
}

private static void Sub1()
{
DbHelperSQL.ExecuteSql("INSERT INTO Items(Item) VALUES(101)");
}



麻烦的是要开启Distributed Transaction Coordinator服务

不开启MSDTC可就玩不转了...唉...用到分布式了....这玩艺也整得太大了....不是一个轻量级的东西 ,用起来总是觉得别扭....
dupoutVIP 2008-10-16
  • 打赏
  • 举报
回复
       /// <summary>
/// 执行查询
/// </summary>
/// <param name="Querys">T-SQL语句的List泛型集合 T是string </param>
/// <returns>返回影响行数</returns>
public static int ExecuteNonQuery(List<string> Querys)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand com = new SqlCommand())
{
com.Connection = con;
con.Open();
SqlTransaction sqlTran = con.BeginTransaction();
try
{
com.Transaction = sqlTran;
int row = 0; ;
foreach (string str in Querys)
{
if (str.Length > 1)
{
com.CommandText = str;
row += com.ExecuteNonQuery();
}
}
sqlTran.Commit();
con.Close();
com.Clone();
con.Dispose();
com.Dispose();
return row;
}
catch (SqlException e)
{
sqlTran.Rollback();
throw new Exception(e.Message);
}
}
}
}
bacely 2008-10-16
  • 打赏
  • 举报
回复
看到一个好东东.....


TransactionScope

也许他能帮到我..嘿嘿.....测试中..
bacely 2008-10-16
  • 打赏
  • 举报
回复
哦.....因为我使用了动软的代码生成器生成了DAL层\BLL层\MODES层,所以,底层代码很简单.....使我都不知道怎么改了...呵呵...

救命啊...
通信相关 1.C#HttpHelper,Httpwebrequest,请求时无视编码,无视证书,无视Cookie,网页抓取 主要是实现了HTTP协议的GET|POST请求时的无视编码,无视证书,设置代理,自动获取Cookie的功能。 访问数据库相关 1.SqlHelper类 使用C#实现对Sql数据库的操作,执行存储过程,Sql语句,返回影响行数,返回DateTable,DataSet,DataReader,以及表集等方法。实现多个数据库的切换功能。功能强大,希望大家喜欢 2.一个操作Sql2005数据库的类(备份,还原,分离,附加,添加删除用户等操作) 这主要是为了让大家练手的,他使用C#代 码的方法实现了对数据的 备份,还原,分离,附加,添加和删除用户等操作 3.DbHelperMySQL类 数据访问抽象基础类 主要是访问Mysql数据库主要实现如下功能 1.得到最大值 2.是否存在 3.是否存在(基于MySqlParameter) 4.执行SQL语句,返回影响的记录数 5.执行MySql和Oracle滴混合事务,执行多条SQL语句,实现数据库事务。 6.执行带一个存储过程参数的的SQL语句。 7.执行带一个存储过程参数的的SQL语句。 8.向数据库里插入图像格式的字段(和上面情况类似的另一种实例) 9.执行一条计算查询结果语句,返回查询结果(object)。 10.执行查询语句,返回MySqlDataReader ( 注意:调用该方法后,一定要对MySqlDataReader进行Close ) 11.执行查询语句,返回DataSet,执行SQL语句,返回影响的记录数,执行多条SQL语句,实现数据库事务。 执行多条SQL语句,实现数据库事务。 12.执行多条SQL语句,实现数据库事务。 13.执行多条SQL语句,实现数据库事务。 14.执行一条计算查询结果语句,返回查询结果(object)。 15.执行查询语句,返回MySqlDataReader ( 注意:调用该方法后,一定要对MySqlDataReader进行Close ) 16.执行查询语句,返回DataSet等等。 复制代码 4.DbHelperOleDb类 1.数据访问基础类(基于OleDb)Access数据库, 2.得到最大值;是否存在;是否存在(基于OleDbParameter); 3.执行SQL语句,返回影响的记录数;执行多条SQL语句,实现数据库事务; 4.执行带一个存储过程参数的的SQL语句; 5.向数据库里插入图像格式的字段(和上面情况类似的另一种实例); 6.执行一条计算查询结果语句,返回查询结果(object); 7.执行查询语句,返回OleDbDataReader; 8.执行查询语句,返回DataSet; 9.执行SQL语句,返回影响的记录数; 10.执行多条SQL语句,实现数据库事务; 11.执行一条计算查询结果语句,返回查询结果(object); 12.执行查询语句,返回OleDbDataReader;执行查询语句,返回DataSet; 复制代码 5.DbHelperOra类 1.数据访问基础类(基于Oracle),主要是用来访问Oracle数据库的。 2.得到最大值;是否存在;是否存在(基于OracleParameter ); 3.执行SQL语句,返回影响的记录数; 4.执行多条SQL语句,实现数据库事务; 5.执行带一个存储过程参数的的SQL语句; 6.向数据库里插入图像格式的字段(和上面情况类似的另一种实例); 7.执行一条计算查询结果语句,返回查询结果(object); 8.执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close ); 9.执行查询语句,返回DataSet; 10.执行SQL语句,返回影响的记录数; 11.执行多条SQL语句,实现数据库事务; 12.执行一条计算查询结果语句,返回查询结果(object); 13.执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close ); 14.执行查询语句,返回DataSet; 15.执行存储过程 返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close ); 16.执行存储过程;构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值); 17.执行存储过程,返回影响的行数; 18.创建 OracleCommand 对象实例(用来返回一个整数值) 复制代码 6.DbHelperSQLite类 [code=csharp] 1.数据访问基础类(基于SQLite),主要是用来访问SQLite数据库的。 2.得到最大值;是否存在;是否存在(基于SQLiteParameter); 3. 执行SQL语句,返回影响的记录数 4.执行多条SQL语句,实现数据库事务。 5.执行带一个存储过程参数的的SQL语句。 6.向数据库里插入图像格式的字段(和上面情况类似的另一种实例) 7.执行一条计算查询结果语句,返回查询结果(object)。 8.执行查询语句,返回SQLiteDataReader 9.执行查询语句,返回DataSet 10.执行SQL语句,返回影响的记录数 11. 执行多条SQL语句,实现数据库事务。 12. 执行一条计算查询结果语句,返回查询结果(object)。 13.执行查询语句,返回SQLiteDataReader 14.执行查询语句还参数,返回DataSet[/code] 7.DbHelperSQLP类 8.DbHelperSQL类 9.OracleHelper类

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧