哈喽,你好啊,我是雷工!
前边学习封装了增删改的方法封装:
本节继续学习将两种典型的查询方法封装成类。
下边为学习笔记。
01 封装单一返回结果的封装
在查看封装后的代码之前,可以先看下封装前代码的写法:
《C#知识|通过ADO.NET实现应用程序对数据库的查询操作。》
对比查看,更有助于封装的学习。
1.1、封装代码
封装单一返回结果的方法和增删改的写法类似;
在SQLHelper类中创建封装方法的代码:
/// <summary>
/// 执行单一返回结果的查询方法
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static object GetSingleResult(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
return cmd.ExecuteScalar();
}
catch (Exception ex)
{
//此处可以捕获ex对象相关信息,然后保存到日志文件中
throw new Exception("执行GetSingResult发生异常:" + ex.Message);
}
finally //此处为无论是否发生异常都要执行的代码
{
conn.Close();
}
}
1.2 调用类方法
在Program.cs中调用封装的方法
代码如下:
//引入需要的命名空间
using System.Data.SqlClient;
using System.Data;
namespace LeiGongNotes2
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("欢迎大家关注【雷工笔记】!");
Console.WriteLine("--------------------------");
ExecuteSingleResultByHelper();
Console.ReadLine();
}
static void ExecuteSingleResultByHelper()
{
//定义SQL语句
string sql = "select Count(*)as 账号总数 from Account";
object result = SQLHelper.GetSingleResult(sql);
Console.WriteLine(result);
}
}
}
执行结果:
说明封装的类方法没有问题。
02 封装结果集的查询
封装查询返回结果是结果集的查询方法,
2.1、封装代码
此处需要注意的是需要在try中添加枚举CommandBehavior.CloseConnection,实现关闭关联的Datareader对象时,关联的Connection对象也会关闭;
然后去掉了后边的finally中的手动关闭;
同样在SQLHelper类中创建封装方法的代码:
public static SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
//此处添加枚举CommandBehavior.CloseConnection
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
//此处可以捕获ex对象相关信息,然后保存到日志文件中
throw new Exception("执行GetSingResult发生异常:" + ex.Message);
}
//finally //由于上方添加枚举,去掉手动关闭
//{
// conn.Close();
//}
}
2.2 调用类方法
在Program.cs中调用封装的方法
代码如下:
//引入需要的命名空间
using System.Data.SqlClient;
using System.Data;
namespace LeiGongNotes2
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("欢迎大家关注【雷工笔记】!");
Console.WriteLine("--------------------------");
ExecuteReader();
Console.ReadLine();
}
static void ExecuteReaderByHelper()
{
//定义SQL语句
string sql = "select AccountName,AccountContent,originality from Account where AccountId<10008";
SqlDataReader reader = SQLHelper.GetReader(sql);
//判断是否查询结果,来决定是否继续读取数据
while (reader.Read())
{
Console.WriteLine(#34;{reader["AccountName"]}\t{reader["AccountContent"]}\t{reader["originality"]}");
}
reader.Close();//关闭读取器对象(由于在类方法中添加了枚举,此时关闭reader时,会首先把它使用的连接对象关闭)
}
}
}
执行结果:
说明封装运行没有问题,
03 后记
只是测试程序中可能不能明显的看出来这种封装的好处,
但在实际项目中,代码量多了以后就可以发现这种封装可以优化掉大量的重复代码,
当前方式虽然减少了大量重复代码,但是SQL语句和功能等分层还不明确,接下来会继续学习代码的分层,
让代码的分工更加明确,让代码更优雅,更清晰,更简洁。
感兴趣的同学可以点赞+关注+在看,我们一起学习进步。
本文暂时没有评论,来添加一个吧(●'◡'●)