权限管理、用户权限系统、开源用户权限系统、信息化建设标准基础数据管理平台
代码改变世界

随笔分类 -  [03] 项目开发经验

Power Designer (PD) 由物理数据模型PDM生成数据库脚本时带双引号的问题

2011-05-08 22:03 by 通用C#系统架构, 1385 阅读, 收藏, 编辑
摘要: 由物理数据模型PDM生成数据库脚本时带引号的问题产生一个数据库创建脚本1 选择Database-> Generate Database。发现生成的脚本带引号,,,/*==============================================================*//* Table: "CUSTOMER" *//*==============================================================*/CREATE TABLE "CUSTOMER" ( "CUST_SID& 阅读全文

C# 读取保存App.config配置文件的完整源码参考

2011-01-15 23:33 by 通用C#系统架构, 16410 阅读, 收藏, 编辑
摘要: 最近出差在北京做一个小项目,项目里需要读取配置文件的小功能,觉得挺有参考意义的就把代码发上来给大家参考一下。我们选择了直接用微软的读取配置文件的方法。 阅读全文

3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

2010-10-07 21:39 by 通用C#系统架构, 82469 阅读, 收藏, 编辑

 

 

   十一休假,杭州西湖边逛了一圈只能用人山人海来形容,浙大紫金港校区也逛了一圈风景如画,建设得真不错很棒,假期就去了这2个地方,然后在家里陪老婆、看孩子、洗尿布、打了几局星际争霸,在网上接了一个B/S架构的内部管理类定制软件、淘宝上收了600元辛苦费后就开始行动了、现在把整个开发过程讲解分享如下文。

 

客户需求

   一个简单的项目管理信息的,添加、删除、编辑、查询等功能的实现,把大的框架做好就可以,细节他会自己完善好,想想也很简单的一样,本以为1天时间就足可以搞定了,结果足足干了3天才算竣工,由于客户也是软件开发人员,沟通起来也比较顺畅一些,否则可能不止需要3天了。

 

   项目虽然很小,但是由于跟我的主营方向是一致的,同时也想锻炼一下做项目的成熟程度有多高、有多快,所以也没嫌弃钱多钱少,开开心心就把这个项目开始启动了。项目虽然小但五脏俱全来形容了这个活儿了。

   很多必要的功能虽然在需求里没有提到,但是都是需要做好的,例如:

         01:系统的登录功能、这个是必然要有的。

         02:记住密码功能,而且是需要有加密功能的。

         03:退出系统的功能,总需要能安全退出系统的吧。

         04:用户管理功能,例如哪些用户才能登录到系统里来?

         05:用户修改密码功能,停用功能,设置密码功能等。

         06:用户可以访问那些菜单等?

         07:用户有哪些操作权限等?

         08:角色管理功能,用户角色关系功能,角色的权限功能。

         09:友善的菜单导航功能。

         10:没有权限的友善提示功能。

         11:附件的管理、上传、下载、删除等等。

         12:查询分页功能等等,虽然都没提出,但是这些功能都需要做好的。

 

 

整体开发思路

 

数据库分2个设计:业务数据 + 权限数据,互相不干扰,相互比较独立一些。

整个系统分3个种干系人: 开发人员 + 系统管理员 + 操作人员,他们对系统各自的期望值及操作的内容如下图。

为了快速搞定项目,毕竟项目的预算很有限,所有有些功能模块能不开发就不开发,那我们就用现成的成熟组件,通用权限管理系统,做为用户账户管理、权限管理

菜单管理的核心组件,这样可以大大的提高工作效率,可以灵活配置管理这个小型B/S项目信息管理系统了。

 

 

项目的具体开发制作步骤

 

步骤1:项目虽然很小,但是还是按规范的软件开发步骤比较好,我们还是本着先有设计后有开发的思路,先不急着写代码,我们先把数据库结构设计好,本系统应该只设计一个表就可以了,我们先要想好哪些数据用什么格式保存,都需要哪些字段来表示各种属性,效果图如下,我们用了数据库建模工具PowerDesigner,来设计我们的业务模型中的数据模型吧,这就是所谓的开发上的领域模型吧,其实这个设计还是蛮关键的,设计乱了后面都会乱套了。

 

步骤2:通过用设计好的模型,我们先手工建立相应的数据库及数据表。

 

步骤3:下图是已经建立好的数据的效果图,Project是业务数据库、Project表是项目信息表,后面的Base_Sequence 用于产生序列及唯一排序号、Base_Comment 用于修改记录保存功能,这些不用重复设计,直接从UserCenterV30数据中心里复制过来结构就可以了,为了在软件里显示一些数据出来,可以通过手工方式先录入一些演示数据,这样成就感会更多一些、信心也更足一些,因为很快就可以在软件里显示数据出来了。

 

步骤4:生成好相应的数据表后,可以用代码生成器生成一些没有多少商业逻辑的代码了,所谓的添加、删除、修改、查询的代码都不用写了,直接用代码生成器生成好就可以了,虽然这个技术不怎么先进,但是省事省心,对技术的要求也很低,生成好的代码也比较规范一些,而且还支持多种数据库,还是蛮好的,若生成好后,数据库结构有变化了,也没关系,重新生成一下就可以了,生成代码1分钟足够了,顶多是命名空间可能需要整理一些就可以了,属于是很经得起折腾的做法了。

 

步骤5:将生成好的代码,复制到相应的位置上,适当的修正一下命名空间什么的,因为是一个很小的项目,根本不用分层啥的,分那么多层也是多余的,其实分目录就足够可以了,若很懒惰的话目录都可以不用分了,分层其实更适合大型软件项目,小项目以见效最快为主,没必要搞个7-8个层,这里是是1个层也没分,只是分了一些目录,显得思路更清晰一些。

 

步骤6:代码生成器不能生成所有的代码,有些代码还是有商业逻辑的,需要人工编写,其中ProjectManager.cs 中的代码就是有具体商业逻辑的代码,这部分代码无法靠代码生成器自动生成好,需要按自己的需要进行编写的,这里有2个功能,一个是查询功能的实现、另一个是更新数据时需要有修改记录的功能,需要详细记录数据被变更的全过程,这些代码都需要人工编写好,页面上会调用这些代码。

 

步骤7:接下来该是规划整个系统的菜单的时候,需要好好规划一下软件的菜单,到底需要有哪些菜单,都叫什么名字?当然这一步也可以在在最后做,我们同通用权限管理组件可以灵活规划整个系统的菜单,基本上想怎么设置就怎么设置,想怎么托摘、想怎么排序都可以,规划菜单时会很爽,当然不只是开发人员用起来爽、而且系统管理员今后维护时也会很爽,系统的整个菜单都可以灵活配置权限、可以灵活更改,而不是写死的菜单,将来不依赖开发人员也可以灵活配置管理,灵活设置各种权限限制等等。

 

步骤8:接下来,需要把相应的添加、修改、查询、删除功能页面做出来,可以考虑到今后可能会扩展很多模块进来,所有目录规划得合理一些,说不定还要做人事管理、考勤管理、薪资管理、工作日志管理等等很多模块,其实都是大同小异而已,更多是技术是体现在细节功能及业务逻辑的深入程度上。

 

步骤9:菜单配置好,页面制作好后,就可以实现登录系统的页面了,当然这个也是用了现成的通用权限管理系统的登录页面,只需要制作一个登录界面,然后调用相应的登录API就可以了,自然就可以达到离职人员不能登录、没有权限的用户不能登录、停用账户不能登录,不能重复登录、限制登录的IP地址等等额外的其他功能都可以集成在里面了,开发人员也不用关心更多的细节,省心省事了。 

 

步骤10:登录好后,通用权限管理系统的底层API,自然会显示有权限的菜单,无权访问的菜单也不会出来了,哪个用户可以访问哪个菜单等等,都可以通过通用权限管理工具灵活配置管理,当然那个工具是给系统管理员、开发人员、实施人员使用的,并不是为了给普通业务操作员使用定位的。软件的最终运行效果就如下图了,由于是系统管理登录的所有菜单都能显示了,当然这里还需要一个成熟稳定的分页组件。

 

 

   底层代码生成器生成的代码,可能只占用这个系统的代码的 1/3左右,但是编写这些代码的时间也省了,整个开发过程不是可以节省1/3了,而且是纯体力劳动而已。整个权限管理等可能需要整个系统开发的1/3左右的精力,若这部分也不用开发了,又可以节省整个软件项目开发的1/3时间。整个框架的稳定完善,也可以说是占用整个软件开发项目的1/3时间是应该的,若是2手空空开始开发的话。

   那我们的项目采用了 代码生成器 + 数据库访问组件 + 通用权限组件 + 成熟的B/S开发框架 足足可以节省一个管理软件项目开发的 2/3 的开发时间,可以把精力全部放在另外的 1/3 的业务逻辑优化、界面细节优化上。

   这样也大大的降低了软件项目的开发的失败风险,谁说你不会在前面的2/3时间上失败呢?未必能走到后面的1/3时间上来啊,对吧。  

 

开发总结

 

  目前3天内搞定一个独立的内部管理系统,而且五脏俱全的是我从业10年左右的最快记录,当然若第二次做类似的东西,可能有希望2天内可以搞定了。

 

  经过多年的积累,手上才会有一个运行稳定、可以灵活配置的B/S开发架构,虽然看看都很简单,但是最起码不断完善几年后,才会达到铜墙铁壁的程度,我们经常会发现,开发一个小小的软件,往往1个月也开发不完,很可能是由于没有稳定的B/S开发架构导致的,这个架构也不是说技术,就是一个美观的整体效果良好的运行稳定的B/S系统吧,从头开发的B/S架构,由于需要调整很多细节环节、特别是页面、菜单的美观设计等上会耗费很多精力。

   有时候界面设计良好、程序思路严谨、用户交互效果好的B/S空框架也能卖出几万元,以前不能理解,现在是彻底能体会了,稳定的B/S架构的确可以值一些钱,因为是经过精雕细刻后才能形成最后的劳动成果的。

 

   软件的大体效果做到这里,大概花费了3天时间、接下来可能要花费的时间会更多,应该不止3天了,可能是30天,因为很多业务上的细节会耗费很多时间来调整,例如新增页面的先后输入的内容,页面输入的检查、页面的美观设计、光标的顺序优化、回车优化,输入内容的完善补充等等,查询页面的排序顺序优化、查询内容的先后顺序排版、表格中各列的宽度调整,一些提醒颜色的优化等等会有很多细节问题上还要耗费很久时间的, 做软件其实就是做细节,你需要有一个良好的B/S开发框架,否则全部自己弄,不知道什么时候才能弄好,有个良好的框架、再有良好的例子程序,整个管理系统,就是一个量的问题了,其次就是很多细节的优化上,会花费很多时间。

   

    有良好的稳定的B/S开发框架,前期工作只用了3天,若没有这个,从头开始做,可能30天也做不完,更不会把大多精力都花费在业务逻辑的细节优化上,可能更多的精力都耗费在B/S系统架构的稳定、优化上了,那这个软件的质量就更没保障了。

 

    有了稳定的B/S开发框架后,才好进行大规模生产、大量招聘人员做开发工作,若这些都没有,招聘来一大堆开发人员,那很可能局面就乱套了,大家就容易乱来了。

 

    ProjectManager.cs手工编写的商业逻辑代码如下:

代码
//------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd .
//------------------------------------------------------------

using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;

namespace Project
{
    
using DotNet.DbUtilities;
    
using DotNet.Manager;
    
using DotNet.Utilities;
    
using DotNet.Business;

    
/// <summary>
    
/// ProjectManager
    
/// 项目跟进表
    
///
    
/// 修改纪录
    
///
    
///        2010-09-28 版本:1.0 JiRiGaLa 创建主键。
    
///
    
/// 版本:1.0
    
///
    
/// <author>
    
///        <name>JiRiGaLa</name>
    
///        <date>2010-09-28</date>
    
/// </author>
    
/// </summary>
    public partial class ProjectManager : BaseManager, IBaseManager
    {
        
public DataTable Search(string userId, string searchValue)
        {
            
// 一、这里是开始进行动态SQL语句拼接,字段名、表明都进行了常量定义,表名字段名发生变化时,很容易就知道程序哪里都调用了这些。
            string sqlQuery = string.Empty;
            sqlQuery 
= " SELECT * "
                    
+ " FROM " + this.CurrentTableName
                    
+ " WHERE " + ProjectTable.FieldDeleteMark + " =  0 ";

            
// 二、我们认为 userId 这个查询条件是安全,不是人为输入的参数,所以直接进行了SQL语句拼接
            if (!String.IsNullOrEmpty(userId))
            {
                sqlQuery 
+= " AND " + ProjectTable.FieldCreateUserId + " = '" + userId + "'";
            }

            
// 三、这里是进行参数化的准备,因为是多个不确定的查询参数,所以用了List。
            List<DbParameter> dbParameters = new List<DbParameter>();

            
// 四、这里看查询条件是否为空
            searchValue = searchValue.Trim();
            
if (!String.IsNullOrEmpty(searchValue))
            {
                
// 五、这里是进行支持多种数据库的参数化查询
                sqlQuery += " AND (" + ProjectTable.FieldKeHuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuMingCheng);
                sqlQuery 
+= " OR " + ProjectTable.FieldKeHuXiangMuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuXiangMuMingCheng);
                sqlQuery 
+= " OR " + ProjectTable.FieldCreateUserRealname + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldCreateUserRealname);
                sqlQuery 
+= " OR " + ProjectTable.FieldDescription + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldDescription) + ")";

                
// 六、这里是判断,用户是否已经输入了%
                if (searchValue.IndexOf("%"< 0)
                {
                    searchValue 
= "%" + searchValue + "%";
                }

                
// 七、这里生成支持多数据库的参数
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuMingCheng, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuXiangMuMingCheng, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldCreateUserRealname, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldDescription, searchValue));
            }
            sqlQuery 
+= " ORDER BY " + ProjectTable.FieldSortCode + " DESC ";

            
// 八、这里是将List转换为数组,进行数据库查询
            return DbHelper.Fill(sqlQuery, dbParameters.ToArray());
        }
        
        
/// <summary>
        
/// 更新(带有修改记录功能)
        
/// </summary>
        
/// <param name="projectEntity">实体</param>
        
/// <param name="changeLog">修改记录</param>
        
/// <returns>影响行数</returns>
        public int Update(ProjectEntity projectEntity, bool changeLog)
        {
            
// 若不需要修改记录
            if (!changeLog)
            {
                
return this.UpdateEntity(projectEntity);
            }

            String changeMessage 
= String.Empty;

            
// 获取原来的数据
            ProjectEntity oldProjectEntity = this.GetEntity((int)projectEntity.Id);
            
if (oldProjectEntity.KeHuXiangMuMingCheng != projectEntity.KeHuXiangMuMingCheng)
            {
                changeMessage 
+= "客户项目名称被修改为:" + projectEntity.KeHuXiangMuMingCheng + " 原值:" + oldProjectEntity.KeHuXiangMuMingCheng + "<br>";
            }
            
if (oldProjectEntity.KeHuMingCheng != projectEntity.KeHuMingCheng)
            {
                changeMessage 
+= "客户名称被修改为:" + projectEntity.KeHuMingCheng + " 原值:" + oldProjectEntity.KeHuMingCheng + "<br>";
            }

            
if (oldProjectEntity.KaiGaiRiQi != projectEntity.KaiGaiRiQi)
            {
                
// changeMessage += "开改模日期被修改为:" + ((DateTime)projectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + " 原值:" + ((DateTime)oldProjectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + "<br>";
            }

            
if (!String.IsNullOrEmpty(changeMessage))
            {
                BaseCommentManager commentManager 
= new BaseCommentManager(this.DbHelper, this.UserInfo);
                commentManager.Add(
"工程管理", projectEntity.Id.ToString(), projectEntity.KeHuXiangMuMingCheng, changeMessage, false, String.Empty, falsethis.UserInfo.IPAddress);
            }

            
return this.UpdateEntity(projectEntity);
        }
    }
}

 

 

 

系统架构逻辑参考图【强调了领域模型+面向服务编程理念】

2010-10-06 13:39 by 通用C#系统架构, 5027 阅读, 收藏, 编辑
摘要: 10.1假期过得真快啊,一下子过去6天,还有一天休息就上班了,其实这个假期有春节那么长,但是没春节那么热闹而已,这今天杭州的天气不错,去浙大紫金港校区转了一圈,新浙大校区的确建得很不错,从家里打车过去只要12元就够了,算是很近了。 鼻炎一直没有彻底好,稍微有些闹心,网友希望能看到整个系统的逻辑图,我就画了一张,看看自己的思路是否足够严谨,希望能与大家都沟通多交流。 阅读全文

管理类软件中常见的【一人多职问题】的解决方法参考交流

2010-10-04 13:00 by 通用C#系统架构, 3733 阅读, 收藏, 编辑
摘要: 当技术玩得及格了后,也难以突破时,我们所关心的事情会转向业务知识,没有过硬的业务知识就难与客户沟通、难以拿下大合同,难以竞标取胜。 我们的客户通常会有一些实际问题,这些问题又往往比我们在设计时考虑的问题要更加复杂一些,当然也可以用一个人多账号的方式解决一人多职问题,但是那样实现的在实际工作上用起来难免有些不方便,虽然问题被简化了,但是无法根治问题。 阅读全文

【草根总结】软件质量可以得到明显提高的10个环节

2010-10-04 09:43 by 通用C#系统架构, 2401 阅读, 收藏, 编辑
摘要: 【草根总结】软件质量可以得到明显提高的10个环节 定位!到底要做什么!做成什么样子!实现什么价值! 00:就是想要“明显”地提高软件的质量,那最好是找一些比较靠谱的开发人员 ,淘汰思路不严谨的。 01:软件采用成熟的开发套路,就像CMMI体系一样,质量会有明显的提高,例如一个有10年以上的软件公司积累出来的开发套路。 02:软件的设计检查评估环节, 阅读全文

[走火入魔失眠夜]浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】

2010-09-30 04:05 by 通用C#系统架构, 9189 阅读, 收藏, 编辑
摘要: 不是不想做高科技,在没有能力做高科技时就把低科技做得稳定、成熟、绝对可靠,能重复利用吧,欢迎阅读草根技术博文 [什么是幸福?天天在做自己想做的事情,家人、同事、朋友、客户、网友都和和睦睦,身体健康、钱包鼓鼓、身边美女同事多多赏心悦目、生活无忧无虑就是最大的幸福] 阅读全文

巧用 ROW_NUMBER() 生成不重复的唯一排序码,按客户的需要任意排序数据

2010-09-28 14:39 by 通用C#系统架构, 4609 阅读, 收藏, 编辑
摘要: 由于各种类别输入了蛮多测试信息,有几百条数据,一个个把排序码都生成也很麻烦,看能否没有什么好办法能生成不重复的,唯一排序码?达到如下效果?总不可能人工的一个个输入吧? 也没那个耐心的,还是想想有什么好办法吧? 阅读全文

内部管理类软件基础架构思想(思路图解 + 配套免费视频)

2010-09-20 10:38 by 通用C#系统架构, 5701 阅读, 收藏, 编辑
摘要: 两三年前就想把这个读取配置文件的,进行一次彻底得改造,一直没精力或者能力还不到位,说实话整体编写代码的能力不够的原因应该是占主要成分,由于这两三年,一直想把这个做好,所以想了很久了,思路成熟时,就一口气把这部分给修正过来了,希望能与大家一同分享劳动成果。 现在把整个思路逻辑图及相关的注释写好,希望能给需要的人,提供一个参考。 阅读全文

记一次登录程序的改进过程(改进记住密码功能、提高用户交互)

2010-09-20 09:17 by 通用C#系统架构, 2037 阅读, 收藏, 编辑
摘要: 原程序还没“记住密码”功能,每次运行程序反复输入密码,总感觉有些不好用,虽然这个程序不是天天用,但是往往在自己的电脑里运行,管理配置,很少会别人来用这个权限管理配置软件,昨天豁出去把这个功能彻底进行了修正。 阅读全文

程序员如何才能提高自己?通过一次重构代码讲解自己的感受【有代码比较】

2010-09-16 16:42 by 通用C#系统架构, 2905 阅读, 收藏, 编辑
摘要: 大家是否还有印象, 伍华聪 曾经写了一篇文章 吉日嘎啦通用权限管理系统解读及重构升华--高度封装的编辑窗体 ,虽然我也是很顽固的人,其实这篇文章从另一个角度看待问题的话: 1:伍华聪这个家伙蛮厉害的,看了我的架构半天不到,就找出了不少,页面中存在的问题,能理解别人的架构,而且还能找出别人架构里的问题,这是需要一个境界的。 2:伍华聪不只是停留在找出问题上,而且还能有水平支出,这些问题如何修改,如何做才会更好,而且还能做出相应的例子程序来,这就是高手中的高手了。 阅读全文

实际工作中遇到的技术难题与大家交流(工作流条件表达式计算部分),希望技术高手能给于指点

2010-09-06 23:03 by 通用C#系统架构, 1831 阅读, 收藏, 编辑
摘要: 有一个审核的工作流程,默认情况下是 【杭州编辑审核】--》 【北京编辑审核】--》 【信息发布员审核】--》 【信息发布】这个是一个典型的工作审核流程,我们可以简单的建立3个角色,来定义这个审核流程,也很容易可以达到目的,但是问题没这么简单了。 阅读全文

string.Format 并不能防止SQL注入攻击才对,由于死活不信邪,特意做了测试来证明一下的确存在SQL注入攻击危险

2010-08-21 18:12 by 通用C#系统架构, 4813 阅读, 收藏, 编辑
摘要: 收到一封博客园网友的回复后,我总觉得string.Format 并不能防止注入攻击啊, string.Format 并没有那么神奇的功能啊。看原文的,从表面上,绝对是没防止SQL注入攻击,除非是底层又进行了处理,否则很明显是存在注入攻击的,源码如下: 阅读全文

C# ASP.NET程序员整合Java门户单点登录PHPwind论坛博客软件集成项目经验总结

2010-08-19 10:41 by 通用C#系统架构, 5202 阅读, 收藏, 编辑
摘要: 有人曾问,如何正确估算项目周期?你是天天写C#程序的程序员,若做了一个 PHPwind 的单点登录,那估计需要几天时间? 客户只提了一个需求,门户网站需要与 PHPwind 需要有单点登录功能,问你多长时间能弄好?就一个功能嘛,那1天时间是不是足够了?外包一天工作量按2000元计算,那这个功能是否收2000元就可以了?不就门户网站里登录一下,论坛也自动变成登录状态就可以了,不用再次输入用户名密码就可以了,需求就这么简单。 阅读全文

水晶报表在大型WEB内部管理系统里的滑铁卢

2010-08-11 11:43 by 通用C#系统架构, 1858 阅读, 收藏, 编辑
摘要: 去年我们开发一套相对是大型的内部管理系统,纯WEB的那种,其中客户有蛮多的打印单据的要求,当时我们选择了用微软的水晶报表,也没有忧郁什么,因为这个可是开发环境里默认带的工具。 结果正式上线后水晶报表遇到了很多问题,其中主要的问题有以下几点: 阅读全文

C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考

2010-07-04 18:23 by 通用C#系统架构, 18304 阅读, 收藏, 编辑
摘要: 有时候也好奇,若是老外发个技术文章,会不会到处是有人骂街的?进行人身攻击的?中国人喜欢打击别人,不知道老外是不是也是这个性格?好奇的问一下大家。 往往我们在开发程序、调试程序时,无法模拟多用户同时操作的实际环境下的运行情况。 为了模拟多用户并发操作,我们先写个多线程的例子来充分模拟多用户并发的情况 阅读全文

C#、ASP.NET主键到底怎么写比较好?ID?Id?id?IDs?Ids?ids?欢迎大家指点

2010-06-23 21:53 by 通用C#系统架构, 3987 阅读, 收藏, 编辑
摘要: 数据库中的每个记录都需要有一个主键来唯一识别,那到底写ID?还是id?还是Id?我也苦恼了很多天,当然可能是由于我的英语水平不高导致的吧,我把用法推荐给大家,也欢迎大家提宝贵的意见。 阅读全文

【浙大网新图灵通讯】无废话简单高效C#编码规范20100621

2010-06-22 14:03 by 通用C#系统架构, 1385 阅读, 收藏, 编辑
摘要: 无废话简单高效C#编码规范2010060621 自己看自己的代码啥问题也没有,但是一个团队、N多个人、N多年的代码,就比较难维护、难阅读了,什么样的不好的习惯、错误漏洞能出来的就全出来了。 阅读全文

按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码

2010-06-20 23:20 by 通用C#系统架构, 2716 阅读, 收藏, 编辑
摘要: 先有设计,后有代码,改设计总比改代码更容易一些,改设计的成本更低廉,软件也要按图纸施工,没有图纸的建筑物,将来也不好维护,没有数据库设计的软件更怎么可能好维护呢? 阅读全文

若3行代码能改进简化为1行代码,那对整个公司会有多少影响?

2010-06-15 00:00 by 通用C#系统架构, 1484 阅读, 收藏, 编辑
摘要: 以前写的代码例如如下3行 DataTable dataTable = new DataTable(BaseStaffTable.TableName); DbHelper.Fill(dataTable, sqlQuery); return dataTable; 经过仔细整理后发现这个代码其实只写一行就可以了 return DbHelper.Fill(sqlQuery); 阅读全文


C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权


微信扫一扫加好友



点击右上角即可分享
微信分享提示