示例【1】
1、創建SQLHelper
類
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Reflection;
namespace Db
{
public class SQLHelper<T> where T : class, new()
{
/// <summary>
/// 鏈接數據庫字符串
/// </summary>
public static string strConnectionString = ConfigurationManager.ConnectionStrings["DataConnectionString"].ToString();
/// <summary>
/// 數據庫連接
/// </summary>
public SqlConnection Connection = null;
public SQLHelper()
{
OpenConnect();
}
/// <summary>
/// 打開數據庫連接
/// </summary>
public void OpenConnect()
{
if (Connection == null || Connection.State != System.Data.ConnectionState.Open)
{
Connection = new SqlConnection(strConnectionString);
Connection.Open();
}
}
/// <summary>
/// 關閉數據庫連接
/// </summary>
public void CloseConnect()
{
if (Connection != null && Connection.State != System.Data.ConnectionState.Closed)
{
Connection.Close();
}
}
#region 對數據庫進行讀寫操作
/// <summary>
/// 執行查詢語句
/// </summary>
/// <param name="strSQL">SQL語句</param>
/// <param name="obQuery">SQL參數的值</param>
/// <returns></returns>
public SqlDataReader ExecReader(string strSQL, object obQuery)
{
SqlCommand command = new SqlCommand(strSQL, Connection);
if (obQuery != null)
{
PropertyInfo[] pis = obQuery.GetType().GetProperties();
foreach (var p in pis)
{
command.Parameters.Add(new SqlParameter(p.Name, p.GetValue(obQuery, null)));
}
}
SqlDataReader reader = command.ExecuteReader();
return reader;
}
/// <summary>
/// 執行返回單值的查詢語句
/// </summary>
/// <param name="strSQL">SQL語句</param>
/// <param name="obQuery">SQL參數的值</param>
/// <returns></returns>
public object ExecSingleValue(string strSQL, object obQuery)
{
SqlCommand command = new SqlCommand(strSQL, Connection);
if (obQuery != null)
{
PropertyInfo[] pis = obQuery.GetType().GetProperties();
foreach (var p in pis)
{
command.Parameters.Add(new SqlParameter(p.Name, p.GetValue(obQuery, null)));
}
}
return command.ExecuteScalar();
}
/// <summary>
/// 執行非查詢語句
/// </summary>
/// <param name="strSQL">SQL語句</param>
/// <param name="obQuery">SQL參數的值</param>
/// <returns></returns>
public int ExecNoQuery(string strSQL, object obQuery)
{
SqlCommand command = new SqlCommand(strSQL, Connection);
if (obQuery != null)
{
PropertyInfo[] pis = obQuery.GetType().GetProperties();
foreach (var p in pis)
{
command.Parameters.Add(new SqlParameter(p.Name, p.GetValue(obQuery, null)));
}
}
return command.ExecuteNonQuery();
}
#endregion
#region 返回列表List<T>,利用"泛型+反射"
/// <summary>
/// 獲取列表
/// </summary>
/// <param name="strSQL">SQL語句</param>
/// <param name="obQuery">SQL參數的值</param>
/// <returns></returns>
public List<T> GetList(string strSQL, object obQuery)
{
//調用執行查詢語句函數,返回SqlDataReader
SqlDataReader reader = ExecReader(strSQL, obQuery);
//定義返回的列表
List<T> list = new List<T>();
//定義T類型的實體
T model = new T();
//獲取T類型實體的屬性類型和值
PropertyInfo[] pis = model.GetType().GetProperties();
//獲取數據庫返回的列數
int intColCount = reader.FieldCount;
//遍歷SqlDataReader
while (reader.Read())
{
//定義
int value_number = 0;
//重新實例化T
model = new T();
//從數據庫拿出一條數據后,循環遍歷T類型的屬性類型和值
for (int i = 0; i < intColCount; i++)
{
//判斷第一列是否為row_number,此為分頁使用
if (reader.GetName(i) == "row_number") value_number++;
//設置T對應屬性的值
pis[i].SetValue(model, reader.GetValue(value_number), null);
value_number++;
}
//將T添加到列表中
list.Add(model);
}
return list;
}
#endregion
/// <summary>
/// 獲取分頁
/// </summary>
/// <param name="strTotalSQL">總共個數的SQL</param>
/// <param name="obTotalQuery">總共個數的SQL參數的值</param>
/// <param name="strSQL">分頁的SQL</param>
/// <param name="obQuery">分頁SQL參數的值</param>
/// <param name="intPageIndex">分頁編號</param>
/// <param name="intPageSize">分頁大小</param>
/// <returns>返回PagesList<T></returns>
public PagedList<T> GetPageList(string strTotalSQL, object obTotalQuery, string strSQL, object obQuery, int intPageIndex, int intPageSize)
{
//定義分頁對象的編號和大小
PagedList<T> pageList = new PagedList<T>(intPageIndex, intPageSize);
//執行獲取單個值的函數,設置分頁對象的總元素
pageList.intTotalCount = (int)ExecSingleValue(strTotalSQL, obTotalQuery);
//設置分頁對象的分頁數
if (pageList.intTotalCount % intPageSize == 0) pageList.intPages = pageList.intTotalCount / intPageSize;
else pageList.intPages = pageList.intTotalCount / intPageSize + 1;
//定義列表,調用獲取列表的函數獲取此分頁的元素
List<T> list = GetList(strSQL, obQuery);
//將列表元素添加到分頁對象當中
pageList.AddRange(list);
//設置分頁對象是否有上一頁和下一頁
pageList.HasNextPage = pageList.intPageIndex < pageList.intPages ? true : false;
pageList.HasPrPage = pageList.intPageIndex > 1 ? true : false;
return pageList;
}
/// <summary>
/// 獲取單個實體
/// </summary>
/// <param name="strSQL">SQL語句</param>
/// <param name="obQuery">SQL參數的值</param>
/// <returns></returns>
public T GetTM(string strSQL, object obQuery)
{
//調用執行查詢語句,返回SqlDataReader
SqlDataReader reader = ExecReader(strSQL, obQuery);
//新建一個T類型
T model = new T();
//獲取T類型的屬性類型和值
PropertyInfo[] pis = model.GetType().GetProperties();
//獲取數據庫返回數據的列數
int intColCount = reader.FieldCount;
//讀取數據,填充T
if (reader.Read())
{
int value_number = 0;
for (int i = 0; i < intColCount; i++)
{
pis[i].SetValue(model, reader.GetValue(value_number), null);
value_number++;
}
}
return model;
}
}
/// <summary>
/// 分頁實體類
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedList<T> : List<T>
{
/// <summary>
/// 分頁編號
/// </summary>
public int intPageIndex { get; set; }
/// <summary>
/// 分頁大小
/// </summary>
public int intPageSize { get; set; }
/// <summary>
/// 分頁數
/// </summary>
public int intPages { get; set; }
/// <summary>
/// 總元素的個數
/// </summary>
public int intTotalCount { get; set; }
/// <summary>
/// 此分頁元素的個數
/// </summary>
public int intCount { get; set; }
/// <summary>
/// 是否有下一頁
/// </summary>
public bool HasNextPage { get; set; }
/// <summary>
/// 是否有上一頁
/// </summary>
public bool HasPrPage { get; set; }
public PagedList(int intPageIndex, int intPageSize)
{
this.intPageIndex = intPageIndex;
this.intPageSize = intPageSize;
}
}
}
2、調用方法
// 調用方法:ResumeTM 為數據庫表的實體類
public List<ResumeTM> GetResumeByJobInfoId(int intJobInfoId)
{
SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
string strSQL = @"select * from Resume where FirstJobId=@JobInfoId or SecondJobId=@JobInfoId order by CreateTime desc";
object obQuery = new { JobInfoId = intJobInfoId };
List<ResumeTM> list = helper.GetList(strSQL, obQuery);
helper.CloseConnect();
return list;
}
public ResumeTM GetResumeById(int intId)
{
SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
string strSQL = @"select * from Resume where Id=@Id";
object obQuery = new { Id = intId };
ResumeTM tm = helper.GetTM(strSQL, obQuery);
helper.CloseConnect();
return tm;
}
public PagedList<ResumeTM> GetResume(int intPageIndex, int intPaegSize)
{
SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
string strTotalCount = @"select count(*) from Resume";
string strSQL = @"select * from
(select row_number() over(order by CreateTime desc) as row_number,* from Resume) as t0
where t0.row_number between @intPageSize*(@intPageIndex-1)+1 and @ingPageSize*@intPageIndex";
object obQuery = new { intPageSize = intPaegSize, intPageIndex = intPageIndex };
PagedList<ResumeTM> list = helper.GetPageList(strTotalCount, null, strSQL, obQuery, intPageIndex, intPaegSize);
helper.CloseConnect();
return list;
}
public void Delete(int intId)
{
SQLHelper<ResumeTM> helper = new SQLHelper<ResumeTM>();
string strSQL = @"delete from Resume where Id=@Id";
object obQuery = new { Id = intId };
helper.ExecNoQuery(strSQL, obQuery);
helper.CloseConnect();
}
示例【2】
1、定義實體類
public class BaseModel
{
public int Id { set; get; }
}
public class Company : BaseModel
{
public string Name { get; set; }
public System.DateTime CreateTime { get; set; }
public int CreatorId { get; set; }
public int? LastModifierId { get; set; }
public DateTime? LastModifyTime { get; set; }
}
public class User : BaseModel
{
public string Name { get; set; }
public string Account { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string Mobile { get; set; }
public int? CompanyId { get; set; }
public string CompanyName { get; set; }
public int State { get; set; }
public int UserType { get; set; }
public DateTime? LastLoginTime { get; set; }
public DateTime CreateTime { get; set; }
public int CreatorId { get; set; }
public int? LastModifierId { get; set; }
}
2、編寫通用接口
public interface IBaseDAL
{
T FindT<T>(int id) where T : BaseModel;
List<T> FindAll<T>() where T : BaseModel;
bool Add<T>(T t) where T : BaseModel;
bool Update<T>(T t) where T : BaseModel;
bool Delete<T>(T t) where T : BaseModel;
}
3、使用"泛型+反射"實現接口
public class BaseDAL : IBaseDAL
{
public T FindT<T>(int id) where T : BaseModel
{
Type type = typeof(T);
string sql = $"SELECT {string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"))} FROM [{type.Name}] WHERE ID={id}";
using (SqlConnection conn = new SqlConnection(ConnectionStringCustomers))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
var reader = command.ExecuteReader();
if (reader.Read())
{
return this.Trans<T>(type, reader);
}
else
{
return null;
}
}
}
private T Trans<T>(Type type, SqlDataReader reader)
{
object oObject = Activator.CreateInstance(type);
foreach (var prop in type.GetProperties())
{
prop.SetValue(oObject, reader[prop.Name] is DBNull ? null : reader[prop.Name]);
}
}
public List<T> FindAll<T>() where T : BaseModel
{
Type type = typeof(T);
string sql = $"SELECT {string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"))} FROM [{type.Name}]";
using (SqlConnection conn = new SqlConnection(ConnectionStringCustomers))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
var reader = command.ExecuteReader();
List<T> tList = new List<T>();
while (reader.Read())
{
tList.Add(this.Trans<T>(type, reader));
}
return tList;
}
}
public bool Add<T>(T t) where T : BaseModel
{
//id是自增的 所以不能新增
Type type = t.GetType();
string columnString = string.Join(",", type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)
.Select(p => $"[{p.Name}]"));
string valueColumn = string.Join(",", type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)
.Select(p => $"@{p.Name}"));
var parameterList = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)
.Select(p => new SqlParameter($"@{p.Name}", p.GetValue(t) ?? DBNull.Value));//注意可空類型
string sql = $"Insert [{type.Name}] ({columnString}) values({valueColumn})";
using (SqlConnection conn = new SqlConnection(ConnectionStringCustomers))
{
SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.AddRange(parameterList.ToArray());
conn.Open();
return command.ExecuteNonQuery() == 1;
//新增后把id拿出來? 可以的,在sql后面增加個 Select @@Identity; ExecuteScalar
}
}
}