当前位置:编程学习 > C#/ASP.NET >>

大侠们,事务怎们写啊,写在那层啊

RT,我不知道事务写在哪?
在我看来有人把事务 写在数据库中 写为存储过程,这是针对单个数据库的时候
但是这样代码重用性就降低了,
我以前写的时候习惯将事务 写在BLL中,当时的项目 是针对一种数据库的。

现在 要将项目做成工厂了, 不知道事务写在哪了?

大侠们都给个意见,
我的工厂 预计两种实现 一种是Helper 工厂类型,
                       一种是写好的数据访问工厂。
                    BLL中 写事务 比较麻烦,不知大侠们 用工厂的时候 都在哪开启事务
--------------------编程问答-------------------- 可以用存储过程写事务!

代替执行语句 --------------------编程问答-------------------- 自己顶! --------------------编程问答-------------------- 1.可以写在存储过程中
2.可以写在代码里,好像SqlHelper有支持事务的重载方法

代码里就用SqlTransaction  --------------------编程问答-------------------- 事务一般封装在BLL层 --------------------编程问答--------------------
引用 3 楼 criedshy 的回复:
1.可以写在存储过程中
2.可以写在代码里,好像SqlHelper有支持事务的重载方法

代码里就用SqlTransaction

同意楼上 --------------------编程问答-------------------- 很久都没有用框架了,一般都是做个类库放在里面... --------------------编程问答-------------------- 对工厂型不太熟悉,个人建议写在BLL层中是比较好的。
因为一般只是针对业务逻辑比较多的操作才需要做事务处理。
所以你在封装你的Bll层时可以根据需要写两个方法一个是不需要事务处理的方法,一个是需要事务处理的变通方法 --------------------编程问答-------------------- 1.DB中在存储过程内使用trans
2.DAL层中使用SqlTransaction
3.BLL中使用COM+事务.
--------------------编程问答-------------------- 新手飘过 不懂 --------------------编程问答-------------------- 寫在存儲過程中比較好的! --------------------编程问答-------------------- 等高手 自己顶 --------------------编程问答-------------------- sqlhelper类中就用啦,直接调用就行了 --------------------编程问答-------------------- 写在BLL中吧!学习中! --------------------编程问答-------------------- 用存储过程吧。。   和C#分开 --------------------编程问答--------------------    你的逻辑在哪儿 就写哪一层 事务就是用来处理逻辑的 
    --------------------编程问答-------------------- 顶一下啦! --------------------编程问答-------------------- 你是在等代码还是等高手给你写代码啊?就写在存储过程中,然后用一个通用sqlHelper类调用就可以了…… --------------------编程问答-------------------- dal --------------------编程问答-------------------- DAL层的方法要支持事务调用,在BLL层开启和提交事务即可。 --------------------编程问答--------------------
引用楼主 lxn495838204 的回复:
我以前写的时候习惯将事务 写在BLL中,当时的项目 是针对一种数据库的。

现在 要将项目做成工厂了, 不知道事务写在哪了?

大侠们都给个意见,
我的工厂 预计两种实现 一种是Helper 工厂类型,
  一种是写好的数据访问工厂。
  BLL中 写事务 比较麻烦,不知大侠们 用工厂的时候 都在哪开启事务


不管什么工厂,只要是使用一个数据库,不论是什么类型的数据库,假设是ado.net,那么事务就是 DbTransaction 或者  IDbTransaction。这本身就是抽象的。

难道你以前的BLL没有针对着一层抽象一点的对象类型来写代码? --------------------编程问答-------------------- 搞得我一点都不明白了。。。

我之前都是都是写在Sqlhelper里面。。。

有时候用了点,分布式事务。

先mark,等待 --------------------编程问答--------------------
引用 20 楼 sp1234 的回复:
引用楼主 lxn495838204 的回复:
我以前写的时候习惯将事务 写在BLL中,当时的项目 是针对一种数据库的。

现在 要将项目做成工厂了, 不知道事务写在哪了?

大侠们都给个意见,
我的工厂 预计两种实现 一种是Helper 工厂类型,
一种是写好的数据访问工厂。
BLL中 写事务 比较麻烦,不知大侠们 用工厂的时候 都在哪开启事务

不管什么工厂,只要是使用一个数……


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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,