大侠们,事务怎们写啊,写在那层啊
RT,我不知道事务写在哪?在我看来有人把事务 写在数据库中 写为存储过程,这是针对单个数据库的时候
但是这样代码重用性就降低了,
我以前写的时候习惯将事务 写在BLL中,当时的项目 是针对一种数据库的。
现在 要将项目做成工厂了, 不知道事务写在哪了?
大侠们都给个意见,
我的工厂 预计两种实现 一种是Helper 工厂类型,
一种是写好的数据访问工厂。
BLL中 写事务 比较麻烦,不知大侠们 用工厂的时候 都在哪开启事务
--------------------编程问答-------------------- 可以用存储过程写事务!
代替执行语句 --------------------编程问答-------------------- 自己顶! --------------------编程问答-------------------- 1.可以写在存储过程中
2.可以写在代码里,好像SqlHelper有支持事务的重载方法
代码里就用SqlTransaction --------------------编程问答-------------------- 事务一般封装在BLL层 --------------------编程问答--------------------
同意楼上 --------------------编程问答-------------------- 很久都没有用框架了,一般都是做个类库放在里面... --------------------编程问答-------------------- 对工厂型不太熟悉,个人建议写在BLL层中是比较好的。
因为一般只是针对业务逻辑比较多的操作才需要做事务处理。
所以你在封装你的Bll层时可以根据需要写两个方法一个是不需要事务处理的方法,一个是需要事务处理的变通方法 --------------------编程问答-------------------- 1.DB中在存储过程内使用trans
2.DAL层中使用SqlTransaction
3.BLL中使用COM+事务.
--------------------编程问答-------------------- 新手飘过 不懂 --------------------编程问答-------------------- 寫在存儲過程中比較好的! --------------------编程问答-------------------- 等高手 自己顶 --------------------编程问答-------------------- sqlhelper类中就用啦,直接调用就行了 --------------------编程问答-------------------- 写在BLL中吧!学习中! --------------------编程问答-------------------- 用存储过程吧。。 和C#分开 --------------------编程问答-------------------- 你的逻辑在哪儿 就写哪一层 事务就是用来处理逻辑的
--------------------编程问答-------------------- 顶一下啦! --------------------编程问答-------------------- 你是在等代码还是等高手给你写代码啊?就写在存储过程中,然后用一个通用sqlHelper类调用就可以了…… --------------------编程问答-------------------- dal --------------------编程问答-------------------- DAL层的方法要支持事务调用,在BLL层开启和提交事务即可。 --------------------编程问答--------------------
不管什么工厂,只要是使用一个数据库,不论是什么类型的数据库,假设是ado.net,那么事务就是 DbTransaction 或者 IDbTransaction。这本身就是抽象的。
难道你以前的BLL没有针对着一层抽象一点的对象类型来写代码? --------------------编程问答-------------------- 搞得我一点都不明白了。。。
我之前都是都是写在Sqlhelper里面。。。
有时候用了点,分布式事务。
先mark,等待 --------------------编程问答--------------------
up
--------------------编程问答--------------------
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
namespace MyPetShop.DAL
{
/// <summary>
/// 通用数据库操作类
/// </summary>
public abstract class SQLHelper {
//"server=.;uid=sa;pwd=123456;database=MyPetShop";//
public static readonly string ConnectionString =ConfigurationManager.ConnectionStrings["SqlConnectionString"].ConnectionString;
/// <summary>
/// 获得一个事务对象
/// </summary>
/// <returns></returns>
public static IDbTransaction GetTransaction()
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
return conn.BeginTransaction();
}
#region ExecuteNonQuery
public static int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn ;
if (trans == null)
{
conn = new SqlConnection(ConnectionString);
}
else
{
conn = trans.Connection as SqlConnection;
}
PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
{
return ExecuteNonQuery(null, cmdType, cmdText, cmdParms);
}
public static int ExecuteNonQuery(string cmdText, params SqlParameter[] cmdParms)
{
return ExecuteNonQuery(null,CommandType.Text, cmdText, cmdParms);
}
public static int ExecuteNonQuery(string cmdText)
{
return ExecuteNonQuery(null, CommandType.Text, cmdText, null);
}
public static int ExecuteNonQuery(IDbTransaction trans, string cmdText)
{
return ExecuteNonQuery(trans, CommandType.Text, cmdText, null);
}
#endregion
#region ExecuteReader
public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(ConnectionString);
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch
{
conn.Close();
throw;
}
}
public static SqlDataReader ExecuteReader(string cmdText, params SqlParameter[] cmdParms)
{
return ExecuteReader(CommandType.Text, cmdText, cmdParms);
}
public static SqlDataReader ExecuteReader(string cmdText)
{
return ExecuteReader(CommandType.Text, cmdText, null);
}
#endregion
#region ExecuteScalar
public static object ExecuteScalar(IDbTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn;
if (trans == null)
{
conn = new SqlConnection(ConnectionString);
}
else
{
conn = trans.Connection as SqlConnection;
}
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
public static object ExecuteScalar(string cmdText, params SqlParameter[] cmdParms)
{
return ExecuteScalar(null,CommandType.Text, cmdText, cmdParms);
}
public static object ExecuteScalar(IDbTransaction trans, string cmdText, params SqlParameter[] cmdParms)
{
return ExecuteScalar(trans, CommandType.Text, cmdText, cmdParms);
}
public static object ExecuteScalar(string cmdText)
{
return ExecuteScalar(null,CommandType.Text, cmdText, null);
}
public static object ExecuteScalar(IDbTransaction trans, string cmdText)
{
return ExecuteScalar(trans,CommandType.Text, cmdText, null);
}
#endregion
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, IDbTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans as SqlTransaction;
cmd.CommandType = cmdType;
if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
}
}我写的这里面的 --------------------编程问答-------------------- 顶帖!飘过~~
不过我简单的认为:事务是sql写的,所在应该写在数据访问成里面!即DAL里面!
--------------------编程问答-------------------- 应该写在BLL里吧
补充:.NET技术 , C#