首页 > 代码库 > 深入.NET平台的软件系统分层开发

深入.NET平台的软件系统分层开发

第一章 软件系统的分层开发

案例

学生管理

建类库DAL

添加类

建窗体把数据绑定到datagrivel

因为不同一个项目下

所以要引用

技术分享

技术分享

 数据访问层

Data Access Layer(DAL)

using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MySchool.DAL{    //CRUD  Create Read Update Delete    public class StudentDAL    {        //四个方法        public void AddStudent()        {        }        //读取所有的学生        public DataTable SelectStudent()        {            string sql = "select *from student";            string str="Data Source=.;initial catalog=MySchool; uid=Sa";            SqlConnection con=new SqlConnection(str);            SqlDataAdapter da=new SqlDataAdapter(sql,con);            DataSet ds=new DataSet();            da.Fill(ds,"stuInfo");            return ds.Tables["stuInfo"];        }        public void UpdateStudent()        {        }        public void DeleteStudent()        {        }    }}
using MySchool.DAL;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace MySchool.UI{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            //添加引用            StudentDAL dal=new StudentDAL();            DataTable dt=dal.SelectStudent();            dataGridView1.DataSource = dt;        }    }}

 常见问题

1.不能启动类库项目

2.项目下的一个类名,和真实的Class关键字名称不一致

三层代码掉用图

1.在一个解决方案下,挂在两个项目:.一个类库.窗体

2.在DAL层创建一个名称为StudentDAL的类,该类的结构如下:  并在该类中植入  一个共有的发光法 SelectStudent()  将来是要被UI层调用的  (内存中的一个集合)

 

技术分享

 

 

技术分享

 技术分享

 技术分享

 微软提供一个文件夹app,congig  XML文件用来储存数据库的链接命令

GAC(Global  Assembly  Cache)全局程序集缓存

技术分享

 =====================================================================================================================

第二章实体

1.异常的分类:编译时异常 运行时异常

2.异常捕获日志

3.为了保证程序出现异常的情况下不中断执行

DivedByZeroException----ArthimaticException----SysyemException

Masage:对异常信息的一个描述

StackTrace:精准定位到异常的引发点,确切到行数

InnerException:SQl报错的情况下

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            #region readyonly const(必考)           //const 可以在类中和方法中使用 但是readonly自能在类中不能在方法中            //编译.将源文件幻化成   中间文件的时候C#中的中间文件MSIL其实就是exe文件            //静态方法中,只能直接访问静态成员            //若想非静态,先new 再通过对象名,变量名访问            //被const修饰的类成员默认加上了static关键字            //readonly在运行还时赋值而const是在编译时系统就已经将值给了常亮            //const只能修饰值类型和特殊的引用类型,string  readonly可以修饰所有数据类型            #endregion                          }        }  }

 ========================================================================================

第三章从数据访问开始

using关键字可以引入命名空间

释放资源:释放资源的类型  是  非托管资源,不被clr(公共语言运行时)监管的资源  JIT托管

using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CASE{    class Program    {        static void Main(string[] args)        {            //使用using释放链接对象            string str = "Data Source=.; Initial CataLog=Blog;Uid=Sa";            SqlConnection con = new SqlConnection(str);            con.Open();            con.Dispose();            con.Open();            Console.WriteLine("OK");            Console.ReadKey();            //1.导入命名空间            //释放非托管资源            //2.为什么出了{},资源就可以自动释放            //因为出了{}的时候系统自动调用了对象的Dispose方法,Dispose(),内部调用了Close();            //3/Dispose()和Close的区别            //Dispose()销毁了和DB的COn            //Close()没有销毁通道,还可以再次打开            //4 using(对象){}            //是否所有的对象都可以通过using释放            //不是,对象不许有CLose()方法才能使用using            //释放的对象必须实现IDisposable  接口        }    }}

============================================================================== 

第四章业务的拓展三层构架

1.BLL

2.MD5加密

3.在C#中能开启事务

快捷键 Alter+Shift+主键

三层架构图

Three Layer Schema Diagram

技术分享

事务的特性

原子性  一致性  隔离性 永久性 

begin  Transaction

commit Trabsaction

Rollback  Transaction

事务的锁机制

事务的并发访问策略

在SQL 中不加锁 回避事务

select *from grade with(nolock)

 如果ADO.Net中有实物的参与,真正能影响数据表记录的就不再是

你执行完玩Excecute系列方法之后,而是事务提交或者和i滚之后

让多个执行过程数据准确,保证多个执行单元的数据的完整性

事务队形的形成要在链接对象打开之后 Open

技术分享

string str="";  /占用内存

string str=string.Empty;//占用内存。性能高于“”

string str=null;//不占内存

Mobel  和底层表对应的实体类

DAL  和数据表 相关的操作

BLL 隔离DAL和UI

UI 负责页面的回显

Common 通用曾

DataView 数据扩容

dv.RowFilter="studentname=xxx";

dv.Soet="studentno  desc";

 ====================================================================

第五章实体类Windows程序中的高级应用

1分层DAL数据访问层  负责与数据库交互Mobel 实体层   在三层中传递对象Bll  业务逻辑层  引用DAL 负责业务逻辑处理Common  工具类曾2,各层之间的引用关系BLL---->mobel和DALDAL --->MobelUI---->Mobel和BLLyijiCommon3.多路异常捕获try{}cath (子类异常){}cath(父类异常){}4.异常架构图SQLExceptionArgumentNullExceptionFileNotFoundExceptionIOExceptionApplicationException5.常见的属性Message:消息StackTrace:堆栈消息更精准  行号InnerException :SQL语句 App.config书写在UI层 但是制定的节点可以在DAl层2读取,因为编译后所有的依赖文件都被放倒DeBug文件夹下和xxx.exe同一目录下<connectionStrings>  <add name="constr" connectionString=""/> <connectionStrings>需要在DAL首先   引入System.Configuration程序集添加using引用using  Sysxxx书写SQlHelper文件 ConfigurationManager.connectionString["constr"].ConnectionString6.const和readonly   1.const修饰的数据类型只能是值类型和String   2.const定义位置 const类和方法都行  readonly只能在类中   3.const赋值时机:便宜是赋值,readonly运行时赋值using 关键字using可以引入命名空间using也可以释放资源using(IDisposible对象){    释放的是非托管资源}close和Dispose()区别连接对象被销毁 7.参数化查询  万能登陆发or 1=1 --SqlConnectionSqlCommndSqlDatReaderSqlDataAdaptercmd.CommandTtype=CommandType.StoredProcedureSqlParameter[] p={  new SqlParameter("@gender",gender),  new SqlParameter("@count",SqlDbType.Int)  output  new SqlParameter("@name",SqlDbType.Int)    return}p[1].Direction=ParameterDirection.Output;p[2].Direction=ParameterDirection.ReturnValue;加入到cmd对象中cmd.parameters.AddRange(p);cmd.xxxxx();p[1].Valuep[2].Value8.加密MD5CryptoProvider  m=new MD5CryptoProvider();String str="xxxxx";byte[] b1=Encoding.Default.GetByTes(str);byte[] b2=m.ComputHash(bytes);String b=String.Empty;foreach(byte item in b2){   b+=item.ToString("X2")}9.开启事务Transcation tx=con.BeginTracrtion();cnd.Transaction=tx;tx.Commit();10select gradeid as 编号  ,gradename 年纪名称 from grade

 

深入.NET平台的软件系统分层开发