代码复用的必要性
在实际开发中百分之80%以上都是增删改查操作,如果每次执行都创建各种数据访问对象,然后调用对象的方法,就会使得我们所编写的程序代码存在大量冗余,这对于后续的维护带来很大的不方便。
通用数据访问类SQLHelper的使用
面向对象编程的基本要求:
- 通过类或方法封装,隐藏内部细节,实现代码复用。
- 程序应该具备良好的可扩展性、可维护性和安全性。
实现代码复用技术的要求:
原则:提取不变的,封装变化的
技巧:不变的作为“方法体”,变化的作为方法“参数”。
通用数据访问类SQLHelper的编写
1–封装ExecuteScalar()方法。
private static string connString = "Server=.;DataBase=StudentManageDB;Uid=sa;Pwd=aaa999a9";
/// <summary>
/// 单一结果查询
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static object GetSingleResult(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
object result = cmd.ExecuteScalar();
conn.Close();
return result;
}
2-封装ExecuteNonQuery()方法
/// <summary>
/// 更新数据操作 (执行insert Update、delete类型的sql语句)
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int Update(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int result = cmd.ExecuteNonQuery();
conn.Close();
return result;
}
3-封装ExecuteReader()方法
/// <summary>
/// 返回一个结果集
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader objReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
// conn.Close();
return objReader;
}
通用数据访问类SQLHeoper代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace ADO.NET3
{
/// <summary>
/// 通用数据访问类
/// </summary>
class SQLHelper
{
private static string connString = "Server=.;DataBase=StudentManageDB;Uid=sa;Pwd=aaa999a9";
/// <summary>
/// 单一结果查询
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static object GetSingleResult(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
object result = cmd.ExecuteScalar();
conn.Close();
return result;
}
/// <summary>
/// 更新数据操作 (执行insert Update、delete类型的sql语句)
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int Update(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int result = cmd.ExecuteNonQuery();
conn.Close();
return result;
}
/// <summary>
/// 返回一个结果集
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader objReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
// conn.Close();
return objReader;
}
}
}
主程序代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace ADO.NET3
{
class Program
{
static void Main(string[] args)
{
单一或一行一列查询
//string sql = "select Count(*) from Students";
//object sql1 = SQLHelper.GetSingleResult(sql);
//Console.WriteLine(sql1);
//Console.ReadLine();
增 删 改 数据操作
// string sql = "update students set studentname='{0}' where studentid={1}";
// sql = string.Format(sql, "修改1", 10073);
// int sql2 = SQLHelper.Update(sql);
// if (sql2 == 1)
// {
// Console.WriteLine("修改成功");
// }
// else { Console.WriteLine("修改不成功"); }
// Console.ReadLine();
//返回一个或多个结果集
string sql = "select StudentId,StudentName from Students;select ClassId,ClassName from StudentClass";
SqlDataReader objReader = SQLHelper.GetReader(sql);
while (objReader.Read())
{
Console.WriteLine(objReader["StudentId"] + " " + objReader["StudentName"]);
}
if (objReader.NextResult())
{
while (objReader.Read())
{
Console.WriteLine(objReader["ClassId"] + " " + objReader["ClassName"]);
}
}
objReader.Close();
Console.ReadLine();
}
}
}