ORM框架学习(四)

匿名 (未验证) 提交于 2019-12-02 23:59:01

ORM框架----删除数据

本节是ORM框架学习的第四节,主要内容是用户数据的删除

Delete方法也是一个通用的泛型方法,其定义如下所示:

public bool Delete<T>(int id) where T : BaseModel         {             Type type=typeof(T);             string sql = string.Format("delete  from [{0}] where id=@id",type.Name);             SqlParameter[] sqlparas = new SqlParameter[]{ new SqlParameter("@id",id)};              try             {                 return ExecuteSql<bool>(sql, sqlparas, command =>                 {                     int result = command.ExecuteNonQuery();                     return result > 0;                 });                 //using (SqlConnection conn = new SqlConnection(conStr))                 //{                 //    SqlCommand cmd = new SqlCommand(sql, conn);                 //    cmd.Parameters.AddRange(sqlparas);                 //    conn.Open();                 //    int result = cmd.ExecuteNonQuery();                 //    return result > 0;                 //}             }             catch (Exception ex)             {                  Console.WriteLine(ex.Message);             }                          return true;         }

上述代码和我们之前的查询、新增、更新代码类似,唯一区别就是用委托,做了代码优化。其实我们的查询、新增、更新和现在的删除代码,都存在相同点,所有的ADO .NET代码都包含下图所示部分:

private T ExecuteSql<T>(string sql, SqlParameter[] paras, Func<SqlCommand, T> command)         {             string conStr = "Server=127.0.0.1;Database=master; integrated security=SSPI";             using (SqlConnection conn = new SqlConnection(conStr))             {                 SqlCommand cmd = new SqlCommand(sql, conn);                 cmd.Parameters.AddRange(paras);                 conn.Open();                 return command.Invoke(cmd);             }                      }

如上代码所示,用户只需要提供操作的sql语句和参数化列表,以及需要回调的函数即可。该方法的好处有:

3.我们需要打印日志之类的只需在该方法定义即可

通过ExecuteSql方法,我们把之前的查询、新增、更新代码做了下升级

查询代码:

public T Query<T>(int id) where T : BaseModel         {                         try             {                 Type t= typeof(T);                 string sql = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.FindSql);                 SqlParameter[] pa = new SqlParameter[]{ new SqlParameter("@id",id)};                 return ExecuteSql<T>(sql, pa, command =>                 {                     SqlDataReader reader = command.ExecuteReader();                     T ti = Activator.CreateInstance<T>();                     while (reader.Read())                     {                         foreach (var prop in t.GetProperties())                         {                             var pro = prop.GetMappingName();                             prop.SetValue(ti, reader[pro] is DBNull ? null : reader[pro], null);                         }                     }                     return ti;                 });                 //using (SqlConnection con = new SqlConnection(conStr))                 //{                 //    SqlCommand cmd = new SqlCommand(sql, con);                 //    con.Open();                 //    cmd.Parameters.Add(pa);                                     //}             }             catch (Exception ex)             {                 return null;             }         }

新增代码:

public bool AddData<T>(T t) where T:BaseModel         {             try             {                 Type type=typeof(T);                 string AddStr = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.AddSql);                 var sqlpara = type.GetProperties().FilterKey().Select(p => new SqlParameter("@" + p.GetMappingName(), p.GetValue(t) ?? DBNull.Value)).ToArray();                  return ExecuteSql<bool>(AddStr, sqlpara, command =>                 {                     int result = command.ExecuteNonQuery();                     return result > 0;                 });                 //using (SqlConnection conn = new SqlConnection(conStr))                 //{                 //    SqlCommand cmd = new SqlCommand(AddStr, conn);                 //    cmd.Parameters.AddRange(sqlpara);                 //    conn.Open();                 //    int result= cmd.ExecuteNonQuery();                 //    return result > 0;                 //}             }             catch (Exception ex)             {                 throw new Exception(ex.Message);             }         }

更新代码:

public bool Update<T>(T t) where T : BaseModel         {              try             {                 Type type = typeof(T);                 string UpdateStr = SqlBuilder<T>.GetSql(SqlBuilder<T>.SqlType.UpdateSql);                 var sqlpara = type.GetProperties().Select(p => new SqlParameter("@" + p.GetMappingName(), p.GetValue(t) ?? DBNull.Value)).ToArray();                 return ExecuteSql<bool>(UpdateStr, sqlpara, command =>                 {                     int result = command.ExecuteNonQuery();                     return result > 0;                 });                 //using (SqlConnection conn = new SqlConnection(conStr))                 //{                 //    SqlCommand cmd = new SqlCommand(UpdateStr, conn);                 //    cmd.Parameters.AddRange(sqlpara);                 //    conn.Open();                 //    int result = cmd.ExecuteNonQuery();                 //    return result > 0;                 //}             }             catch (Exception ex)             {                 throw new Exception(ex.Message);             }         }

观察升级过后的代码,有没有发现ExecuteSql的妙处了。我们不管操作数据库sql语句返回的是bool类型还是一个实体对象,我们都可以调用该方法。对于每个操作返回的数据做下单独处理,就实现了所有的类型操作。

到目前为止,ORM框架基本知识已经差不多学习完成了。博主所写内容都是自己学习过程的总结和拙见,如有不妥之处,欢迎给位园友批评指正.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!