目录
一、数据库中创建表
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)添加业务处理程序
///
/// 获取数据总条数
///
///
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)添加业务处理程序
///
/// 删除制定ID行数据
///
///
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)添加业务处理程序
///
/// 插入数据。
///
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值类型。
///
/// 插入数据。
///
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)封装该方法应用于其它几个可空的列
封装方法
///
/// 抽象的方法:判断往数据库写的数据是否为null
///
///
///
public static object ToDBValue(object value)
{
if (value =https://www.it610.com/article/= null)
{
return DBNull.Value;
}
else
{
return value;
}
}
修改DAL的Insert方法
///
/// 插入数据。
///
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的类
【ADO.NET|C#数据库教程7-ADO.NET三层架构和数据库DBNull问题】(1)添加业务处理程序
读取的数据库表中的数据可能包含DBNull
///
/// 读取数据表中指定ID的数据
///
///
///
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方法
///
/// 抽象的方法,判断从数据库中读的数据是否为null。如果value这个数据库中的值为DBNull,则返回null
///
///
///
public static object FromDBValue(object value)
{
if(value=https://www.it610.com/article/=DBNull.Value)
{
return null;
}
else
{
return value;
}
}
(2)修改DAL中的GetByID程序
///
/// 读取数据表中指定ID的数据
///
///
///
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#对Access数据库的操作
- C# Winform 服务器和多个客户端通讯
- 注册表限制软件使用次数
- 数值算法|分段线性插值 C#代码
- C#|C#数据库教程1-使用ADO.NET操作sql server 2012
- C#|C#数据库教程2-ADO.NET常用SQL语句
- C#|C# Udp测试工具开发
- ADO.NET|C# Access数据库使用
- 一起学习华为自研数据库GaussDB(DWS)这次高斯不是数学家