时间:2016-02-15 23:55 来源: 我爱IT技术网 作者:佚名
欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【.net三层结构初探分析第1/4页】,下面是详细的讲解!
.net三层结构初探分析第1/4页
对于学习,我选择了ACCESS数据库+存储过程的方式,这里记录的是我个人的学习体会和笔记,与网上的可能有不同之处,观点也不可能全部相同。为什么使用三层结构:
首先要明确,三层结构并不能使系统变快,实际上它会比起“单类结构”慢。但越来越多人使用三层结构开发,为啥呢?我在使用中,发现三层结构十分清晰,一个类,一个文件你该放在哪层就放哪层,不会象单类结构那样全部放到App_Data中,造成结构混乱。当然,使用三层结构的原因肯定不是那么肤浅,它对团队开发,系统可维护性有十分重要的意义。
三层结构是代码量增多,且代码多重复?
确实,三层代码要写很多很白痴,很简单的代码,比如MODEL这个实体类,如果你需要一个admin的实体,那么你需要写这样的代码:
而有多个实体的话,你要再写这些白痴代码,为什么叫它白痴代码?因为这些代码你看着个表就可以写出来了。一次和老汤讨论中,介绍了一个软件,叫做“动软.Net代码生成器”,这些白痴代码让这个软件自己去生成吧!在这里也推荐大家用这个软件,可以减少很多代码量,BLL,DAL,WEB层的代码都可以去生成,但要完全符合使用的话,还需要自己做些修改。
下面讲讲我理解的三层,先上张图1:
WEB :界面层,其实就是一个网站。BLL:逻辑处理层。
DAL:数据访问层
DBUtility:数据层基类
Model:实体类
Common:存放公用函数
图2这里需要讲讲那个DBUtility这个层,你可以看到有4个文件:
1、DbHelperOleDb.cs:用于SQL语句
2、DbHelperOleDbP.cs:用于存储过程
3、DbHelperOleDbS.cs:用于具体实现,比如“根据条件判断是否存在”、“返回最大的ID”...
4、PubConstant.cs:数据库连接代码
三层结构要求不能跨层访问,在图1中大家可以看到,3个层之间是逐层依赖的。与普通“单类结构”最明显的区别是,这里举一个添加数据的例子(伪代码):
我想对于单类结构来说,总是在WEB层拼凑SQL语句,然后调用数据操作类执行SQL语句,这样速度确实快一些。
看看:
你看出之间一层层的依赖关系了吗?“单类结构”直接就是WEB->DBUtility,而三层是WEB->BLL->DAL->DBUtility,MODEL作为实体类都可以不算一个层,COMMON也是,DBUtlity也是,它们只能算是把具有共同使用功能的代码堆放在一起。所以,三层就是WEB(界面层)->BLL(逻辑处理层)->DAL(数据访问层),并且是层层依赖。而后面引申出来的项目(COMMON,MODEL,DBUtlity),并不算层。按我理解是这样,如果有什么理解错误或不妥的地方欢迎指出,大家一起讨论。
最好的学习方法就是看代码,我写了比较简单的给大家学习下:
using System;
using System.Collections;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace MyCms.DBUtility
{
//数据访问基类(基于OleDb)
public partial class DbHelperOleDb
{
//数据库连接字符串,在web.config中配置
public static string ConnectionString=PubConstant.ConnectionString;
public DbHelperOleDb()
{
}
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <param name="strSql">SQL语句</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSql(string strSql)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
using (OleDbCommand cmd=new OleDbCommand(strSql, conn))
{
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch(OleDbException E)
{
conn.Close();
throw new Exception(E.Message);
}
}
}
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务
/// </summary>
/// <param name="SqlStrList">多条SQL语句</param>
public static void ExecuteSqlTran(ArrayList SqlStrList)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
conn.Open();
OleDbCommand cmd=new OleDbCommand();
cmd.Connection=conn;
OleDbTransaction tx=conn.BeginTransaction();
cmd.Transaction=tx;
try
{
for (int n=0; n < SqlStrList.Count; n++)
{
string strSql=SqlStrList[n].ToString();
if (strSql.Trim().Length > 1)
{
cmd.CommandText=strSql;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (System.Data.OleDb.OleDbException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
}
}
/// <summary>
/// 执行带一个存储过程参数的SQL语句
/// </summary>
/// <param name="strSql">SQL语句</param>
/// <param name="content">参数内容,比如一个字段是格式复杂的文章</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSinglePro(string strSql, string content)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
OleDbCommand cmd=new OleDbCommand(strSql, conn);
OleDbParameter myParameter=new OleDbParameter("@content",OleDbType.VarChar);
myParameter.Value=content;
cmd.Parameters.Add(myParameter);
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (OleDbException E)
{
throw new Exception(E.Message);
}
finally
{
cmd.Dispose();
conn.Close();
}
}
}
/// <summary>
/// 执行一条计算查询结果语句,返回查询结果
/// </summary>
/// <param name="strSql">SQL语句</param>
/// <returns>查询结果</returns>
public static object GetSingle(string strSql)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
using (OleDbCommand cmd=new OleDbCommand(strSql, conn))
{
try
{
conn.Open();
object obj=cmd.ExecuteScalar();
if ((Equals(obj, null)) || Equals(obj, DBNull.Value))
{
return null;
}
else
{
return obj;
}
}
catch (OleDbException E)
{
conn.Close();
throw new Exception(E.Message);
}
}
}
}
/// <summary>
/// 返回OleDbDataReader
/// </summary>
/// <param name="strSql">查询语句</param>
/// <returns>OleDbDataReader</returns>
public static OleDbDataReader ExecuteReader(string strSql)
{
OleDbDataReader dr=null;
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
using(OleDbCommand cmd=new OleDbCommand(strSql,conn))
{
try
{
conn.Open();
cmd.CommandText=strSql;
cmd.CommandType=CommandType.Text;
dr=cmd.ExecuteReader();
}
catch
{
dr.Close();
conn.Close();
cmd.Dispose();
}
}
}
return dr;
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="strSql">查询语句</param>
/// <returns>DataSet</returns>
public static DataSet Query(string strSql)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
DataSet ds=new DataSet();
try
{
conn.Close();
OleDbDataAdapter da=new OleDbDataAdapter(strSql, conn);
da.Fill(ds, "ds");
}
catch (OleDbException E)
{
throw new Exception(E.Message);
}
return ds;
}
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace MyCms.DBUtility
{
public partial class DbHelperOleDb
{
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
public static int ExecuteSql(string strSql, params OleDbParameter[] parms)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
using (OleDbCommand cmd=new OleDbCommand())
{
try
{
PrepareCmd(cmd, conn, null, strSql, parms);
int rows=cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (OleDbException E)
{
throw new Exception(E.Message);
}
}
}
}
/// <summary>
/// 执行一条计算查询结果语句,返回查询结果(object)。
/// </summary>
/// <param name="SQLString">计算查询结果语句</param>
/// <returns>查询结果(object)</returns>
public static object GetSingle(string SQLString, params OleDbParameter[] cmdParms)
{
using (OleDbConnection connection=new OleDbConnection(ConnectionString))
{
using (OleDbCommand cmd=new OleDbCommand())
{
try
{
PrepareCmd(cmd, connection, null, SQLString, cmdParms);
object obj=cmd.ExecuteScalar();
cmd.Parameters.Clear();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
}
}
}
/// <summary>
/// 执行查询语句,返回OleDbDataReader
/// </summary>
/// <param name="strSQL">查询语句</param>
/// <returns>OleDbDataReader</returns>
public static OleDbDataReader ExecuteReader(string SQLString, params OleDbParameter[] cmdParms)
{
OleDbConnection connection=new OleDbConnection(ConnectionString);
OleDbCommand cmd=new OleDbCommand();
try
{
PrepareCmd(cmd, connection, null, SQLString, cmdParms);
OleDbDataReader myReader=cmd.ExecuteReader();
cmd.Parameters.Clear();
return myReader;
}
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString">查询语句</param>
/// <returns>DataSet</returns>
public static DataSet Query(string SQLString, params OleDbParameter[] cmdParms)
{
using (OleDbConnection connection=new OleDbConnection(ConnectionString))
{
OleDbCommand cmd=new OleDbCommand();
PrepareCmd(cmd, connection, null, SQLString, cmdParms);
using (OleDbDataAdapter da=new OleDbDataAdapter(cmd))
{
DataSet ds=new DataSet();
try
{
da.Fill(ds, "ds");
cmd.Parameters.Clear();
}
catch (System.Data.OleDb.OleDbException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
}
///添加存储过程参数
private static void PrepareCmd(OleDbCommand cmd, OleDbConnection conn, OleDbTransaction trans, string cmdText, OleDbParameter[] cmdParms)
{
if (conn.State==ConnectionState.Closed)
{
conn.Open();
}
cmd.Connection=conn;
cmd.CommandText=cmdText;
if (trans !=null)
{
cmd.Transaction=trans;
}
cmd.CommandType=CommandType.Text;
if (cmdParms !=null)
{
foreach (OleDbParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的OleDbParameter[])</param>
public static void ExecuteSqlTran(Hashtable SQLStringList)
{
using (OleDbConnection conn=new OleDbConnection(ConnectionString))
{
conn.Open();
using (OleDbTransaction trans=conn.BeginTransaction())
{
OleDbCommand cmd=new OleDbCommand();
try
{
//循环
foreach (DictionaryEntry myDE in SQLStringList)
{
string cmdText=myDE.Key.ToString();
OleDbParameter[] cmdParms=(OleDbParameter[])myDE.Value;
PrepareCmd(cmd, conn, trans, cmdText, cmdParms);
int val=cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
trans.Commit();
}
}
catch
{
trans.Rollback();
throw;
}
}
}
}
}
}
关于.net三层结构初探分析第1/4页的用户互动如下:
相关问题:
答: >>详细
相关问题:
答: >>详细
相关问题:
答: >>详细
- 【asp】asp.net url重写浅谈-net-url重写
- 【DataSet】DataSet、DataTable、DataRow区别详解
- 【asp】asp.net 动态添加多个用户控件-net-动态添
- 【ASP】ASP.NET中内嵌页面代码的一个问题-NET-内
- 【创建】ASP.NET Web API教程 创建域模型的方法详
- 【Asp】Asp.net 页面调用javascript变量的值-net-
- 【ASP】ASP.NET 5升级后如何删除旧版本的DNX-NET5
- 【404页面】ASP.NET设置404页面返回302HTTP状态码
- 【asp】asp.net开发中常见公共捕获异常方式总结(
- 【Visual】分享Visual Studio原生开发的10个调试
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
