系列引导:

知识管理系列----1.原型设计

知识管理系列----2.数据库设计

本项目的ORM框架采用LINQ的核心。所有的增删改查均基于LINQ语法实现。

按照ORM基本的三层框架:

SQL底层核心:

        /// <summary>/// 查询SQL语句,并将查询结果实例化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="func"></param>/// <param name="param"></param>/// <returns></returns>public static IEnumerable<T> SelectReader<T>(string sql, Func<System.Data.Common.DbDataReader, T> func, params System.Data.Common.DbParameter[] param)where T:class{using (SqlConnection con = new SqlConnection(connectionString)){SqlCommand cmd = new SqlCommand(sql, con);cmd.Connection.Open();cmd.Parameters.Clear();if (param != null && param.Length > 0){cmd.Parameters.AddRange(param);}SqlDataReader dr = cmd.ExecuteReader();var list = new List<T>();while (dr.Read()){T t = func(dr);if (t != null)list.Add(t);}dr.Close();return list;}}

View Code

Model层:(以g_Node为例)

using System;
using JackCSoft.DAL;
namespace JackCSoft.Model
{/// <summary>/// g_Node:实体类(属性说明自动提取数据库字段的描述信息)/// </summary>
    [Serializable][SelectContext][ExecuteContext]public partial class g_Node{public g_Node(){ }#region Modelprivate int _id = 10000;private string _nodename;private int _nodetype = 0;private int? _create_user;private string _create_ymd;private string _create_hms;private int? _update_user;private string _update_ymd;private string _update_hms;private string _guid = "newid";/// <summary>/// /// </summary>public int ID{set { _id = value; }get { return _id; }}/// <summary>/// /// </summary>public string NodeName{set { _nodename = value; }get { return _nodename; }}/// <summary>/// /// </summary>public int NodeType{set { _nodetype = value; }get { return _nodetype; }}/// <summary>/// /// </summary>public int? create_user{set { _create_user = value; }get { return _create_user; }}/// <summary>/// /// </summary>public string create_ymd{set { _create_ymd = value ; }get { return _create_ymd; }}/// <summary>/// /// </summary>public string create_hms{set { _create_hms = value; }get { return _create_hms; }}/// <summary>/// /// </summary>public int? update_user{set { _update_user = value; }get { return _update_user; }}/// <summary>/// /// </summary>public string update_ymd{set { _update_ymd = value; }get { return _update_ymd; }}/// <summary>/// /// </summary>public string update_hms{set { _update_hms = value; }get { return _update_hms; }}/// <summary>/// /// </summary>public string guid{set { _guid = value; }get { return _guid; }}#endregion Model}
}

View Code

BLL层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections;using JackCSoft.Model;
using JackCSoft.DAL;
using JackCSoft.CommonLib;
using System.Linq.Expressions;
using System.Data.SqlClient;
using JackCSoft.DBUtility;namespace JackCSoft.BLL
{public class BLL_NodeManager{CommonLib.TypePropertyOperation typeProperOperation=new TypePropertyOperation();BLL_g_Node instance_Node = BLL_g_Node.handler;BLL_g_NodeOrder instance_NodeOrder = BLL_g_NodeOrder.handler;#region 查询 select/// <summary>/// 获取顶层node的信息/// </summary>/// <returns></returns>public IEnumerable<g_Node> GetTopNodeInfo(){var obj = new JackCSoft.Model.g_Node();var where = new JackCSoft.Model.g_Node(){ID = 0,NodeType = Convert.ToInt16(NodeTypeEnumer.TopNode)   //顶层Node类型
            };return instance_Node.Select(obj, s => s, where, b => new { b.ID, b.NodeType });}/// <summary>/// 获取顶层node的信息/// </summary>/// <returns></returns>public IEnumerable<TResult> GetTopNodeInfo<TResult>(Func<g_Node,TResult> func) where TResult:class{var obj = new JackCSoft.Model.g_Node();var where = new JackCSoft.Model.g_Node(){ID = 0,NodeType = Convert.ToInt16(NodeTypeEnumer.TopNode)   //顶层Node类型
            };return instance_Node.Select(obj, s => func(s), where, b => new { b.ID, b.NodeType });}/// <summary>/// 根据指定条件查询Node信息/// </summary>/// <returns></returns>public IEnumerable<TResult> GetNodeInfoByWhere<TResult,TWhere>(Func<g_Node, TResult> func,g_Node entity,Func<g_Node,TWhere> funcWhere)where TResult : classwhere TWhere:class{var obj = new JackCSoft.Model.g_Node();return instance_Node.Select(obj, s => func(s),entity,p=>funcWhere(p));}/// <summary>/// 根据GUID查询node信息/// </summary>/// <param name="guid"></param>/// <returns></returns>public IEnumerable<g_Node> GetNodeInfoByGUID(string guid){var obj = new JackCSoft.Model.g_Node();var where = new JackCSoft.Model.g_Node(){guid=guid};return instance_Node.Select(obj, s => s, where, p => new { p.guid});}/// <summary>/// 查询该节点类型的最大值/// </summary>/// <param name="enumer"></param>/// <returns></returns>public g_Node GetMaxNodeIDByNodeType(int enumer){var obj = new JackCSoft.Model.g_Node();var where = new JackCSoft.Model.g_Node(){NodeType=enumer};IEnumerable<g_Node> result=instance_Node.Select(obj, s => s, where, p => new { p.NodeType }).OrderByDescending(m=>m.ID);return (result != null && result.Count() > 0) ? result.ToArray()[0] : null;}/// <summary>/// 查询max id/// </summary>/// <param name="enumer"></param>/// <returns></returns>public g_Node GetMaxNodeID(){var obj = new JackCSoft.Model.g_Node();IEnumerable<g_Node> result = instance_Node.Select(s=>s).OrderByDescending(m => m.ID);return (result != null && result.Count() > 0) ? result.ToArray()[0] : null;}public DataTable GetHtmlContentByID(int id){return DAL_Node.GetHtmlContentByID(id);}#endregion#region 插入 insert/// <summary>/// 往g_Node插入节点信息,并在g_NodeOrder表插入节点顺序信息/// </summary>/// <returns></returns>public bool InsertNode<TNode>(g_Node t,Func<g_Node,TNode> func,int parentNodeID) where TNode:class{//插入g_Node子信息bool _insertOk = instance_Node.Insert(t, s => func(s));if (_insertOk){//查询已经插入的子节点信息 在插入g_NodeOrder表Expression<Func<g_Node,object>> selectEntity=s=>new {s.guid,s.ID};g_Node obj = new g_Node();IEnumerable<object> _resultList = instance_Node.Select(obj, s => selectEntity.Compile()(s), t, p => func(p));if (_resultList != null&&_resultList.ToArray().Count()>0){//插入g_NodeOrder数据表数据g_NodeOrder nodeOrder = new g_NodeOrder{//g_NodeOrder的DBNode_GUID对应g_Node的GUIDDBNode_GUID = Convert.ToString(typeProperOperation.GetPropertyByNameType("guid",_resultList.ToArray()[0])),//本节点的的ID编号 对应的是g_Node的ID字段NodeOrderLoacte=Convert.ToInt32(typeProperOperation.GetPropertyByNameType("ID", _resultList.ToArray()[0])),//父级节点表g_Node 的ID字段         ParentNodeID=parentNodeID            };_insertOk = false;Func<g_NodeOrder,object> fun=s=>new {s.DBNode_GUID,s.NodeOrderLoacte,s.ParentNodeID};_insertOk=instance_NodeOrder.Insert(nodeOrder, s => fun(s));return _insertOk == true ? true : false;}else{return false;}}else{return false;}}/// <summary>/// 往g_Node插入节点信息,并在g_NodeOrder表插入节点顺序信息/// </summary>/// <returns></returns>public bool InsertNode<TNode>(g_Node t, Func<g_Node, TNode> func, int parentNodeID,out string guid) where TNode : class{//插入g_Node子信息bool _insertOk = instance_Node.Insert(t, s => func(s));if (_insertOk){//查询已经插入的子节点信息 在插入g_NodeOrder表Expression<Func<g_Node, object>> selectEntity = s => new { s.guid, s.ID };g_Node obj = new g_Node();IEnumerable<object> _resultList = instance_Node.Select(obj, s => selectEntity.Compile()(s), t, p => func(p));if (_resultList != null && _resultList.ToArray().Count() > 0){//插入g_NodeOrder数据表数据g_NodeOrder nodeOrder = new g_NodeOrder{//g_NodeOrder的DBNode_GUID对应g_Node的GUIDDBNode_GUID = Convert.ToString(typeProperOperation.GetPropertyByNameType("guid", _resultList.ToArray()[0])),//本节点的的ID编号 对应的是g_Node的ID字段NodeOrderLoacte = Convert.ToInt32(typeProperOperation.GetPropertyByNameType("ID", _resultList.ToArray()[0])),//父级节点表g_Node 的ID字段         ParentNodeID = parentNodeID};_insertOk = false;Func<g_NodeOrder, object> fun = s => new { s.DBNode_GUID, s.NodeOrderLoacte, s.ParentNodeID };_insertOk = instance_NodeOrder.Insert(nodeOrder, s => fun(s));//返回执行结果guid = Convert.ToString(typeProperOperation.GetPropertyByNameType("guid", _resultList.ToArray()[0]));return _insertOk == true ? true : false;}else{guid = "";return false;}}else{guid = "";return false;}}#endregion#region 更新 updatepublic bool UpdateNode(string nodeName,string guid){g_Node node = new g_Node{NodeName=nodeName};g_Node where=new g_Node{guid=guid};return instance_Node.Update(node, s => new { s.NodeName }, where, p => new { p.guid});}#endregion#region 删除 deletepublic void DeleteTreeViewNodeByID(int id){DataTable idDt = DAL_NodeOrder.SelectIDByParentID(id);if (idDt != null && idDt.Rows.Count > 0){bool _deleteOK = true;//查询是否存在html等文件信息DataTable dt = DAL_AddressUrl.GetAddressByParentID(id);if (dt != null && dt.Rows.Count > 0)     //存在HTML文件
                {//g_AddressUrl删除信息 g_Content删除信息if (DAL_AddressUrl.DeleteAddressByParentID(id) && DAL_Content.DeleteContentByParentID(id) && DAL_Node.DeleteNodeByID(id)){_deleteOK = true;}else{_deleteOK = false;}}//删除节点信息if (_deleteOK){if (DAL_Node.DeleteNodeByID(id) && DAL_NodeOrder.DeleteNodeOrderByID(id)){for (int i = 0; i < idDt.Rows.Count; i++){DeleteTreeViewNodeByID(Convert.ToInt32(idDt.Rows[i]["ID"]));}}}}else{DAL_Node.DeleteNodeAndChildByID(id);if (DAL_NodeOrder.SelectIDByCurrentNodeID(id) != null){DAL_NodeOrder.DeleteNodeOrderAndChildByID(id);}}//return false;
        }#endregion}
}

View Code

程序源代码:程序源代码

转载于:https://www.cnblogs.com/xiaowangzi1987/p/8663563.html

知识管理系列---3.程序实现相关推荐

  1. 知识管理软件厂商汇总

    知识管理软件厂商汇总知识管理软件厂商汇总: 1. TRS信息技术有限公司:公司提出内容管理的战略,拥有自主核心技术和知识产权的内容管理产品.在信息检索.中文自然语言处理和知识管理等领域,TRS进行了多 ...

  2. aomei动态磁盘管理器_程序员需要了解的硬核知识之磁盘

    点击蓝色"Java建设者"关注我哟 加个"星标",阅读我的文章,一起学习成长. 这是Java建设者的第 42篇原创文章 此篇文章是 <程序员需要了解的硬核 ...

  3. 程序员更需要个人知识管理

    许许多多的开发文档.问题.Bug总结.开源项目.... 一个程序员如何不能好好的管好这些文档,系统的去理解它,而不是记忆它,那么能力的成长将是有限的. 下述是一些有关个人知识管理的资料,也是个人的一些 ...

  4. 敏捷开发团队管理系列之三:程序与测试团队II

    这是敏捷开发团队管理系列的第三篇.(之一,之二,之三,之四) 测试团队的价值 这样看来,敏捷开发的质量保证问题,都被发开团队解决了,测试团队的价值何在? 这个可以从第一个项目组后来的发展来分析. 在整 ...

  5. 敏捷开发团队管理系列之二:程序与测试团队I

    这是敏捷开发团队管理系列的第二篇.(之一,之二,之三,之四) 几个真实案例 这几个团队都是我自己亲身经历的团队,从质量的角度来分析敏捷团队的工作方式. 第一个是一个较为大型的团队,约有25-30人,研 ...

  6. 敏捷开发团队管理系列之四:程序与测试团队III

    这是敏捷开发团队管理系列的第四篇.(之一,之二,之三,之四) 整体上有两种测试团队的模型,既然都有存在,自然是各有各的道理.城里城外的人倒不必互相羡慕,只是要观察对面的优点,分析自己的缺点,尝试做点事 ...

  7. 知识竞赛答题小程序的管理后台搭建教程

    知识竞赛答题小程序的管理后台搭建 知识竞赛答题小程序的管理后台搭建,基于云开发搭建的可视化的内容管理平台,可在云开发控制台扩展管理界面一键部署和升级,也可通过项目提供的脚本自动部署. 题库管理 成绩排 ...

  8. 知识竞赛答题小程序系列-关于成绩排行榜的设计与反思

    接了不少的知识竞赛答题小程序系列,在做的过程中,作为开发者,我常常思考关于排行榜的设计与逻辑,如何把它做得更好,譬如提高用户体验.譬如发挥它的价值...... 什么是排行榜? 排行榜是对某一相关同类事 ...

  9. 企业IT管理基础知识巩固系列之(二)交换机

    接上一篇<企业IT管理基础知识巩固系列之(一)路由器>所讲的迅速了解主流品牌的小方法,在中关村产品报价中,选择"交换机"品类,可以看到以下诸多品牌: 华为 锐捷网络 中 ...

最新文章

  1. 如何快速优雅的在CSDN输入公式?
  2. docker和docker-compose 端口映射
  3. c语言程序设计答案万年历备忘录,基于JavaScript(网页脚本语言)编写的万年历(含源文件)...
  4. 数据中心实施服务器虚拟化前的十大思考
  5. atm取款流程测试_盘点2020年软件测试新手必看的技术面试指南(下)
  6. BarTender怎么打印公式化的三列标签
  7. 计算机硬盘 u盘和光盘属于,磁盘U盘光盘的区别
  8. 0框架前端-如何写一个按钮(button)
  9. linux安装时路径错误,科学网—安装Linux版的hysplit及相关问题集锦-系统Centos - 周勤迁的博文...
  10. python计算机入门基础知识_python全栈学习记录--2(2018.1.13) 计算机基础知识
  11. python简单爬虫,获取豆瓣top250书单(datawhale组队学习task4)
  12. oracle.jdbc.driver.OracleDriver is deprecated
  13. iOS 上传App Store 报 ITMS-90096错误处理方法
  14. 「游戏」岩浆逃脱2.1
  15. Segment routing分段路由
  16. 10寸、10.1寸、10.4寸液晶屏解决方案
  17. 信号处理系列之限幅器(Limiter_FC)
  18. c语言scanf()的返回值
  19. Android之MediaPlayer(两种)基本使用方式
  20. C语言实现实数和复数矩阵及其各种运算(二)

热门文章

  1. 每天一道LeetCode-----比较两个字符串,每个字符串被若干'.'分成多个数字,一个个比较
  2. 每天一道LeetCode-----生成由[1 : n]这n个数组成的所有二叉搜索树
  3. Qt学习笔记-----拖放
  4. 控制台怎么退出mysql_退出mysql控制台与退出mysql
  5. Shell(10)——sed(2)
  6. 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区
  7. 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
  8. [BUUCTF-pwn]——pwnable_echo2
  9. IEDA快速书写代码快捷键
  10. [Jarvis OJ - PWN]——[61dctf]fm