目录

一、数据库中创建表

1、创建数据表T_Person

2、向数据表T_Person中插入数据

3、查看插入的数据

二、 创建C# Winform工程

1、添加引用

2、编辑数据库连接配置文件

3、添加封装的数据库类

三、添加具体业务功能代码

1、创建三层架构

2、查询数据表中的数据总条数

3、删除数据表中指定ID的数据

4、向数据库中插入数据

5、向数据库中插入Null的问题

6、读取指定ID号的数据

7、读取数据库值为DBNull的处理方法

工程下载


一、数据库中创建表

1、创建数据表T_Person

列AiHao这种不确定的类型,可以为nvarchar(MAX)。

2、向数据表T_Person中插入数据

使用查询语句,向数据库中插入4条数据

insert into T_Person(Name,Age,AiHao,Height,BirthDay) values ('Pan',20,'BasketBall',130.00,'1995-09-16')
insert into T_Person(Name,Age,AiHao,Height,BirthDay) values ('Li',30,'FoottBall',110.09,'1985-11-12')
insert into T_Person(Name,Age,AiHao,Height,BirthDay) values ('Wang',40,'Swim',150.59,'1975-01-26')
insert into T_Person(Name,Age,Height,BirthDay) values ('Xu',32,119,'1989-01-02')

3、查看插入的数据

在数据表T_Person中右击编辑前200项,查看插入的四条数据

二、 创建C# Winform工程

1、添加引用

2、编辑数据库连接配置文件

App.config配置文件

3、添加封装的数据库类

添加前面章节中讲解所封装的SqlHelper类

三、添加具体业务功能代码

所谓三层架构一般描述为:表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。本测试比较简单,将业务逻辑就放在UI中处理了。

1、创建三层架构

(1)创建UI窗口界面

UI层即界面层,这一层不出现任何数据库访问代码

(2)创建数据访问层DAL处理类

具体功能代码实现,后面具体展开

(3)创建Model

(Model不属于三层架构)

    class PersonModel{//若在数据库中为可空类型,则C#中定义的数据类型后加?,string自带可空功能可不用添加,int则为int?  public long ID { get; set; }public string Name { get; set; }public int Age { get; set; }public string AiHao { get; set; }public decimal? Height { get; set; }public DateTime? BirthDay  { get; set; }}

2、查询数据表中的数据总条数

(1)添加业务处理程序

        /// <summary>/// 获取数据总条数/// </summary>/// <returns></returns>public static int GetCount(){return (int)SqlHelper.ExecuteScalar("select count(*) from T_Person");}

(2)添加UI控件

(3)添加UI程序

        private void btnDataCountGet_Click(object sender, EventArgs e){int count = PersonDAL.GetCount();txtDataCount.Text = count.ToString();}

(4)运行

3、删除数据表中指定ID的数据

(1)添加业务处理程序

        /// <summary>/// 删除制定ID行数据/// </summary>/// <param name="ID"></param>public static void DeleteByID(long ID){SqlHelper.ExecuteNonQuery("delete from T_Person where ID=@ID",new SqlParameter("@ID", ID));}

(2)添加UI控件

(3)添加UI程序

        private void btnDeleteData_Click(object sender, EventArgs e){long row = int.Parse(txtDeleteRow.Text);PersonDAL.DeleteByID(row);MessageBox.Show("删除成功", "提示");}

(4)运行

先删除指定的第四行,再查询发现数据总数居变成了3条,说明删除成功

查询数据库中,第四条数据已经删除

4、向数据库中插入数据

(1)添加业务处理程序

        /// <summary>/// 插入数据。/// </summary>public static void Insert(PersonModel person){SqlHelper.ExecuteNonQuery("insert into T_Person(Name,Age,AiHao,Height,BirthDay) values (@_Name,@_Age,@_AiHao,@_Height,@_BirthDay)",new SqlParameter("@_Name", person.Name),new SqlParameter("@_Age", person.Age),new SqlParameter("@_AiHao", person.AiHao),new SqlParameter("@_Height", person.Height),new SqlParameter("@_BirthDay", person.BirthDay));}

(2)添加UI控件

(3)添加UI程序

        private void btnInsert_Click(object sender, EventArgs e){PersonModel person = new PersonModel();person.Name = txtName.Text;person.Age = Convert.ToInt32(txtAge.Text);person.AiHao = txtAiHao.Text;person.Height = Convert.ToDecimal(txtHeight.Text);person.BirthDay = Convert.ToDateTime(txtBirthday.Text);PersonDAL.Insert(person);MessageBox.Show("插入成功", "提示");}

(4)运行

数据库中查看

5、向数据库中插入Null的问题

(1)插入null

如数据库中的 ‘AiHao’列为可空项,将UI中的代码注释,设置断点运行

则在写数据时插入null代码异常,SqlHelper类中封装的SQL执行语句显示为缺少未输入参数

(2)解决方法

修改DAL中的代码,在插入数据库之前先判断该项若为null值、则先转换成数据库中的DBNull值类型。

        /// <summary>/// 插入数据。/// </summary>public static void Insert(PersonModel person){object _aiHao;if (person.AiHao==null){_aiHao = DBNull.Value;}else{_aiHao = person.AiHao;}SqlHelper.ExecuteNonQuery("insert into T_Person(Name,Age,AiHao,Height,BirthDay) values (@_Name,@_Age,@_AiHao,@_Height,@_BirthDay)",new SqlParameter("@_Name", person.Name),new SqlParameter("@_Age", person.Age),new SqlParameter("@_AiHao", _aiHao),new SqlParameter("@_Height", person.Height),new SqlParameter("@_BirthDay", person.BirthDay));}

再次运行则发现成功写入

(3)封装该方法应用于其它几个可空的列

封装方法

        /// <summary>/// 抽象的方法:判断往数据库写的数据是否为null/// </summary>/// <param name="value"></param>/// <returns></returns>public static object ToDBValue(object value){if (value == null){return DBNull.Value;}else{return value;}}

修改DAL的Insert方法

        /// <summary>/// 插入数据。/// </summary>public static void Insert(PersonModel person){SqlHelper.ExecuteNonQuery("insert into T_Person(Name,Age,AiHao,Height,BirthDay) values (@_Name,@_Age,@_AiHao,@_Height,@_BirthDay)",new SqlParameter("@_Name", person.Name),new SqlParameter("@_Age", person.Age),new SqlParameter("@_AiHao", ToDBValue(person.AiHao)),new SqlParameter("@_Height", ToDBValue(person.Height)),new SqlParameter("@_BirthDay", ToDBValue(person.BirthDay)));}

成功插入数据

6、读取指定ID号的数据

DAL中不要返回DataTable、DataRow等ADO.Net的类

(1)添加业务处理程序

读取的数据库表中的数据可能包含DBNull

        /// <summary>/// 读取数据表中指定ID的数据/// </summary>/// <param name="ID"></param>/// <returns></returns>public static PersonModel GetByID(long id) {DataTable table = SqlHelper.ExecuteDataTable("select * from T_Person where ID=@ID",new SqlParameter("@ID", id));if (table.Rows.Count <= 0){return null;    //不存在}else if (table.Rows.Count > 1){//主键重复throw new Exception("ID存在重复");     }else{//DAL中不要返回DataTable、DataRow等ADO.Net的类DataRow row = table.Rows[0];PersonModel person = new PersonModel();person.ID = (long)row["ID"];person.Name = (string)row["Name"];person.Age = (int)row["Age"];if (row["AiHao"]==DBNull.Value){person.AiHao = null;}else{person.AiHao = (string)row["AiHao"];}person.Height = (decimal?)row["Height"];            //可空类型person.BirthDay = (DateTime?)row["BirthDay"];       //可空类型return person;}

(2)运行测试

UI按钮事件程序中设置断点测试,读取I数据表中,ID为8的数据

7、读取数据库值为DBNull的处理方法

(1)封装判断读取值是否为DBNull方法

        /// <summary>/// 抽象的方法,判断从数据库中读的数据是否为null。如果value这个数据库中的值为DBNull,则返回null/// </summary>/// <param name="value"></param>/// <returns></returns>public static object FromDBValue(object value){if(value==DBNull.Value){return null;}else{return value;}}

(2)修改DAL中的GetByID程序

        /// <summary>/// 读取数据表中指定ID的数据/// </summary>/// <param name="ID"></param>/// <returns></returns>public static PersonModel GetByID(long id) {DataTable table = SqlHelper.ExecuteDataTable("select * from T_Person where ID=@ID",new SqlParameter("@ID", id));if (table.Rows.Count <= 0){return null;    //不存在}else if (table.Rows.Count > 1){//主键重复throw new Exception("ID存在重复");     }else{//DAL中不要返回DataTable、DataRow等ADO.Net的类DataRow row = table.Rows[0];PersonModel person = new PersonModel();person.ID = (long)row["ID"];person.Name = (string)row["Name"];person.Age = (int)row["Age"];person.AiHao = (string)FromDBValue(row["AiHao"]);               //string本身就是可空类型person.Height = (decimal?)FromDBValue(row["Height"]);            //可空类型person.BirthDay = (DateTime?)FromDBValue(row["BirthDay"]);       //可空类型return person;}

(3)添加UI控件

(4) 添加UI层按钮程序

         private void btnRead_Click(object sender, EventArgs e){long id = int.Parse(txtReadID.Text);PersonModel person = PersonDAL.GetByID(id);//txtReadID.Text = person.ID.ToString();txtReadName.Text = person.Name;txtReadAge.Text = person.Age.ToString();txtReadHeight.Text = person.Height.ToString();txtReadBirthDay.Text = person.BirthDay.ToString();txtReadAiHao.Text = person.AiHao;MessageBox.Show("读取成功", "提示");}

(5)运行程序,读取

读取第3行

读取第8行

若有任何问题,欢迎私聊我。

工程下载

https://download.csdn.net/download/panjinliang066333/85439817

C#数据库教程7-ADO.NET三层架构和数据库DBNull问题相关推荐

  1. 仓储模式和传统三层架构多数据库实现

    仓储模式:通用方法 public class DepartmentRepository : RepositoryBase<DepartmentEntity>, IRepositoryBas ...

  2. ADO.NET三层架构

    文章目录 三层架构设计 一.为什么要使用架构 二.两层架构 两层架构的设计原理 层的创建方式 三.实体对象的可序列化 四.三层架构 五.分层设计的优点 三层架构设计 一.为什么要使用架构 框架能够清晰 ...

  3. mysql数据库三层架构_数据库的三层架构

    三层模式体系结构和数据独立性 第1.3节中列出了数据库方法的4个重要特点,其中有以下3个特点:(1)程序与数据分离(程序-数据独立性和程序-操作独立性):(2)支持多用户视图:(3)使用编目存储数据库 ...

  4. Access数据库教程_如何进行C#连接Access数据库的细节操作?

    许多学者总会面对于 数据库 的知识,以下的例子讲述到 Access 数据库说明,用 C# 的DataSet类访问数据库的一些操作方法. 操作涉及的主要C#类有: DataSet:对应数据库表的一个集合 ...

  5. net以execl做数据库_将Excel直接当作数据库使用,ASP.NET三层架构

    [实例简介] Excel做为数据库登录的三层实现 一个简单的登录验证程序源码,数据库采用的是Excel,利用简单三层实现 DB/users.xls为Excel文件 [实例截图] [核心代码] usin ...

  6. 三层架构与设计模式思想部署企业级数据库业务系统开发

    1. 三层架构介绍 1.1关于架构 架构这个词从它的出现后,就有许许多多的程序员.架构师们激烈地讨论着它的发展,但是架构一词的出现,却是随着三层架构的出现才出现的.当然,目前应用三层架构开发也正是业界 ...

  7. 趣味理解:三层架构与养猪—《.NET深入体验与实战精要》

    为了更好地让初学者轻松入门,这里仍然采用趣味性的方式聊一些常用技术点,致力于.NET新手们的快速提高!知识都是普通的,关键是学习的思路.技术源于生活,技术原来可以这样学.抛砖引玉而已.  层次结构在现 ...

  8. python 三层架构说明_常用的三层架构设计图解大全

    软件系统最常用的一般会讲到三层架构,其实就是将整个业务应用划分为表示层.业务逻辑层.数据访问层等,有的还要细一些,通过分解业务细节,将不同的功能代码分散开来,更利于系统的设计和开发,同时为可能的变更提 ...

  9. 快速实现dNet三层架构项目图解

    开发工具使用SharpDevelop,示例数据库使用微软提供的Northwind.mdb英文版:搭建dNet三层架构项目: 新建UI层:这层可以是web,也可以是form:这里使用form: 新建三个 ...

最新文章

  1. php和mysql实现模糊查询_PHP MYSQL实现登陆和模糊查询两大功能_PHP
  2. 3n+1猜想(求关键数)
  3. oracle 动态sql列转行_SQL优化笔记分享:34条实用经验可别错过!
  4. L2-006. 树的遍历(不建树)
  5. 【Spring学习】IOC容器
  6. Linux 文件与目录管理+用户管理命令(详解+练习)
  7. Windows10+VS2017下GSL1.8_x86和sundials2.5.0配置及GITHUB项目schneider_et_al_2016_animaldiversity编译运行
  8. 价值投资/指标选股(akshare)
  9. XNA Game Studio 2.0安装问题,崩溃了
  10. 企业IT基础架构设计概要
  11. ios 表情符号 键盘_如何在iPhone和iPad上从键盘上删除表情符号按钮
  12. Android开发必知的maven-publish插件知识
  13. #51CTO学院四周年#而立之年的不二之选
  14. 珞珈-B生所学 跟学笔记 PPT(一)
  15. Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask)
  16. 在米帝求学的你,知道每个州的圣诞节特色活动吗!
  17. linux如何连接redis
  18. HTML5超炫全屏焦点图插件
  19. js+html代码设置,HTML+JS = 网站注册界面源代码(示例代码)
  20. python给女友一个小惊喜——桌面宠物【DIY版】

热门文章

  1. ONNX-Simpler报错:Graph must be in single static assignment (SSA) form
  2. 嵌入式开发要求的一些专业技能总结
  3. HTML5期末大作业:花店/鲜花/购物网站设计——网上花店礼品电商购物商城 HTML+CSS+JavaScript 粉色的鲜花礼品电商网站html模板
  4. 物联网时代真的来了,带你认识物联网
  5. 一句话题解(20180210~)
  6. 高通 android 传感器支持,高通:Android手机用户明年将用上刷脸功能
  7. Program received signal SIGPIPE, Broken pipe原因总结,socket关闭测试总结
  8. oracle 39083错误,Oracle数据库导入导出时,ORA-39083;ORA-00439错误解决思路
  9. [树梅派专题笔记]树莓派忘记密码怎么办?
  10. “死亡算法”:预测死亡时间准确率达90%!