BaseDAL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
public class BaseDAL
{
public static int Insert(ModelBase obj)
{
Type type = obj.GetType(); //获取类型
object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false); //获取自定义特性
if (attr.Length == 0)
throw new Exception("必须定义主键列");
string Key = (attr[0] as MyKeyAttribute).Key; //获取主键列
bool IsIdentity = (attr[0] as MyKeyAttribute).IsIdentity; //是否自增长
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
List<SqlParameter> ps = new List<SqlParameter>();
PropertyInfo[] infos = type.GetProperties(); //获取所有属性,即字段名,组装成sql语句
foreach (PropertyInfo p in infos)
{
if (p.GetValue(obj, null) != null)
{
if (p.Name.ToLower() == Key.ToLower() && IsIdentity) //如果是主键列且自增长就跳过
continue;
sb1.Append(p.Name + ",");
sb2.Append("@" + p.Name + ",");
ps.Add(new SqlParameter("@" + p.Name, p.GetValue(obj, null)));
}
}
string sql = string.Format("insert into {0}({1}) values({2})", type.Name, sb1.ToString().Trim(','), sb2.ToString().Trim(','));
return DBHelper.CUD(sql, ps);
}
public static int InsertID(ModelBase obj)
{
Type type = obj.GetType(); //获取类型
object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false); //获取自定义特性
if (attr.Length == 0)
throw new Exception("必须定义主键列");
string Key = (attr[0] as MyKeyAttribute).Key; //获取主键列
bool IsIdentity = (attr[0] as MyKeyAttribute).IsIdentity; //是否自增长
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
List<SqlParameter> ps = new List<SqlParameter>();
PropertyInfo[] infos = type.GetProperties(); //获取所有属性,即字段名,组装成sql语句
foreach (PropertyInfo p in infos)
{
if (p.GetValue(obj, null) != null)
{
if (p.Name.ToLower() == Key.ToLower() && IsIdentity) //如果是主键列且自增长就跳过
continue;
sb1.Append(p.Name + ",");
sb2.Append("@" + p.Name + ",");
ps.Add(new SqlParameter("@" + p.Name, p.GetValue(obj, null)));
}
}
string sql = string.Format("insert into {0}({1}) values({2});select @@identity;", type.Name, sb1.ToString().Trim(','), sb2.ToString().Trim(','));
return Convert.ToInt32(DBHelper.SelectObject(sql, ps));
}
public static int Update(ModelBase obj)
{
Type type = obj.GetType(); //获取类型
object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false); //通过自定义特性,获取主键列
if (attr.Length == 0)
throw new Exception("必须设定主键列!");
string Key = (attr[0] as MyKeyAttribute).Key;
object KeyValue = type.GetProperty(Key).GetValue(obj, null); //获取主键列值
if (KeyValue == null)
throw new Exception("必须给主键列赋值!");
StringBuilder sb1 = new StringBuilder();
List<SqlParameter> ps = new List<SqlParameter>();
PropertyInfo[] infos = type.GetProperties(); //获取所有列值,组装成sql语句
foreach (PropertyInfo p in infos)
{
if (p.GetValue(obj, null) != null)
{
if (p.Name.ToLower() != Key.ToLower())
{
sb1.Append(p.Name + "=@" + p.Name + ",");
ps.Add(new SqlParameter("@" + p.Name, p.GetValue(obj, null)));
}
}
}
string wstr = Key + "=@" + Key; //获取主键列,组装成sql语句
ps.Add(new SqlParameter("@" + Key, KeyValue));
string sql = string.Format("update {0} set {1} where {2}", type.Name, sb1.ToString().Trim(','), wstr);
return DBHelper.CUD(sql, ps);
}
public static int Delete<T>(object objID)
{
Type type = typeof(T);
object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);
if (attr.Length == 0)
throw new Exception("必须指定主键列!");
string Key = (attr[0] as MyKeyAttribute).Key;
string sql = string.Format("delete from {0} where {1}=@{1}", type.Name, Key);
List<SqlParameter> ps = new List<SqlParameter>();
ps.Add(new SqlParameter("@" + Key, objID));
return DBHelper.CUD(sql, ps);
}
public static T SelectObj<T>(object objID)
{
Type type = typeof(T);
object[] attr = type.GetCustomAttributes(typeof(MyKeyAttribute), false);
if (attr.Length == 0)
throw new Exception("必须设定主键列!");
string Key = (attr[0] as MyKeyAttribute).Key;
string sql = string.Format("select * from {0} where {1}=@{1}", type.Name, Key);
List<SqlParameter> ps = new List<SqlParameter>();
ps.Add(new SqlParameter("@" + Key, objID));
T obj = Activator.CreateInstance<T>();
using (DataTable dt = DBHelper.SelectTable(sql, ps))
{
for (int r = 0; r < dt.Rows.Count; r++)
{
PropertyInfo[] infos = type.GetProperties();
foreach (PropertyInfo p in infos)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
if (p.Name.ToLower() == dt.Columns[i].ColumnName.ToLower())
{
if (dt.Rows[r][p.Name] != DBNull.Value)
p.SetValue(obj, dt.Rows[r][p.Name], null);
}
}
}
}
}
return obj;
}
public static List<T> SelectList<T>(string sql = null, List<SqlParameter> ps = null)
{
List<T> list = new List<T>();
Type type = typeof(T);
using (DataTable dt = (sql == null ? DBHelper.SelectTable("select * from " + type.Name) : DBHelper.SelectTable(sql, ps)))
{
for (int r = 0; r < dt.Rows.Count; r++)
{
T obj = Activator.CreateInstance<T>();
PropertyInfo[] infos = type.GetProperties();
foreach (PropertyInfo p in infos)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
if (p.Name.ToLower() == dt.Columns[i].ColumnName.ToLower())
{
if (dt.Rows[r][p.Name] != DBNull.Value)
p.SetValue(obj, dt.Rows[r][p.Name], null);
}
}
}
list.Add(obj);
}
}
return list;
}
}
EntityDAL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
public class EntityDAL : BaseDAL
{
//对表或视图实体的数据操作
}
ModelBase:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class ModelBase
{
}
Entity:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
[MyKey("ID",true)]
public class Entity : ModelBase
{
public System.Int32 ID { get; set; }
public System.String ClassName { get; set; }
public Entity()
{
ClassName = string.Empty;
}
}
MyKeyAttribute:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//自定义特性类
public class MyKeyAttribute : Attribute
{
public string Key { get; set; } //主键列
public bool IsIdentity { get; set; } //是否自增长
public MyKeyAttribute(string key, bool isIdentity)
{
this.Key = key;
this.IsIdentity = isIdentity;
}
}
DBHelper:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
public class DBHelper
{
public static string connstr = ConfigurationManager.ConnectionStrings["connstr"].ToString();
/// <summary>
///无参的增改删
/// </summary>
public static int CUD(string sql)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int result = cmd.ExecuteNonQuery();
return result;
}
}
/// <summary>
///有参的增改删
/// </summary>
public static int CUD(string sql, List<SqlParameter> ps)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
if (ps != null)
cmd.Parameters.AddRange(ps.ToArray());
conn.Open();
int result = cmd.ExecuteNonQuery();
return result;
}
}
/// <summary>
///无参、断开式数据操作
/// </summary>
public static DataSet SelectSet(string sql)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
/// <summary>
///无参、断开式数据操作
/// </summary>
public static DataTable SelectTable(string sql)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
}
/// <summary>
///有参、断开式数据操作
/// </summary>
public static DataTable SelectTable(string sql,List<SqlParameter> ps)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
if (ps != null)
da.SelectCommand.Parameters.AddRange(ps.ToArray());
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
}
/// <summary>
///无参、连接式数据操作
/// </summary>
public static SqlDataReader SelectReader(string sql)
{
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader sr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return sr;
}
/// <summary>
///有参、连接式数据操作
/// </summary>
public static SqlDataReader SelectReader(string sql,List<SqlParameter> ps)
{
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd = new SqlCommand(sql, conn);
if (ps != null)
cmd.Parameters.AddRange(ps.ToArray());
conn.Open();
SqlDataReader sr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return sr;
}
/// <summary>
///调用存储过程,返回DataSet
/// </summary>
public static DataSet SelectProc(string sql, List<SqlParameter> ps)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
//指定命令类型为存储过程模式
da.SelectCommand.CommandType = CommandType.StoredProcedure;
if (ps != null)
da.SelectCommand.Parameters.AddRange(ps.ToArray());
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
/// <summary>
/// 调用存储过程,返回DataTable数组
/// </summary>
public static DataTable[] SelectProcTable(string sql, List<SqlParameter> ps)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
//指定命令类型为存储过程模式
da.SelectCommand.CommandType = CommandType.StoredProcedure;
if (ps != null)
da.SelectCommand.Parameters.AddRange(ps.ToArray());
DataSet ds = new DataSet();
da.Fill(ds);
DataTable[] dts = new DataTable[2];
ds.Tables.CopyTo(dts, 0);
return dts;
}
}
/// <summary>
/// 取单行单列的数据对象
/// </summary>
public static object SelectObject(string sql)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
object obj = cmd.ExecuteScalar();
//conn.Close();
return obj;
}
}
/// <summary>
/// 取单行单列的数据对象
/// </summary>
public static object SelectObject(string sql, List<SqlParameter> ps)
{
using (SqlConnection conn = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
if (ps != null)
cmd.Parameters.AddRange(ps.ToArray());
object obj = cmd.ExecuteScalar();
//conn.Close();
return obj;
}
}
}