随笔-16  评论-163  文章-0  trackbacks-0
  置顶随笔
摘要: 自己写的代码生成工具,支持自定义模板和项目导出,支持改动数据库后不用修改DAL层的CMD参数设置和存储过程,Team中用的还顺手,欢迎大家帮忙提提意见。 阅读全文
posted @ 2012-01-04 22:37 Dennis.Yang 阅读(7329) 评论(104) 编辑
  2012年4月12日

准备做一份自己用的实用类DLL(做好后开源,直接帖子里面贴源码估计不太Make Sense)

实用类的列表如下:(排名不分先后)

01.程序配置管理辅助类 AppConfig
02.DataTable操作辅助类 DataTableHelper
03.Excel操作辅助类(无需VBA引用) ExcelHelper
04.常用文件操作辅助类 FileUtil
05.常用的目录操作辅助类 DirectoryUtil
06.打开、保存文件对话框操作辅助类 FileDialogHelper
07.辅助类RegisterHotKeyHelper
08.获取系统信息、电脑CPU、磁盘、网卡、内存等相关信息辅助类 HardwareInfoHelper
09.键盘操作辅助类KeyboardHelper,提供属性访问敲击那个键,以及发送软键盘消息等操作。
10.鼠标辅助操作类,提供获取鼠标状态以及模拟鼠标点击等操作 MouseHelper
11.DES对称加解密、AES RijndaelManaged加解密、Base64加密解密、MD5加密等操作辅助类 EncodeHelper
12.序列化、反序列化、节点等操作类辅助类 XmlHelper
13.枚举操作辅助类 EnumHelper
14.各种输入格式验证辅助类 ValidateUtil
15.各种常用数组排序操作辅助类 SortHelper
16.定时器辅助类TimerHelper
17.线程操作辅助类ThreadHelper
18.消息操作辅助类MessageHelper


大家看看这个列表怎么样? 暂时我可能只会需要用到这些个,希望我能尽快弄完,哈哈。

紫色为已经弄好的。

家里正在装修中,实在比较忙啊。

 

传送门  MyGenerator 3.9.4.0 发布了,应该比较稳定了  点击传送

posted @ 2012-04-12 21:44 Dennis.Yang 阅读(113) 评论(4) 编辑
  2012年1月4日
摘要: 自己写的代码生成工具,支持自定义模板和项目导出,支持改动数据库后不用修改DAL层的CMD参数设置和存储过程,Team中用的还顺手,欢迎大家帮忙提提意见。 阅读全文
posted @ 2012-01-04 22:37 Dennis.Yang 阅读(7329) 评论(104) 编辑
  2011年4月16日
摘要: 一哥们去一著名跨国大大大的公司去面试。在很多项目经验,设计,架构,前台,后端都考察个遍后...私以为快要拿到Offer的时候... 不信的事情发生了。考官出了两道大二时候经常考的算法题。用惯了IDE的他居然一时蒙掉了,提笔多次却无从落笔。悲剧之余,只得铩羽而归... 为了不和这哥们一样,我觉得好好复习复习算法相关的问题,争取每天一个算法题,以题促进。对于我个人的解决方案肯定有部分是比较粗陋的,希望各位大牛不吝赐教,留下各位的算法。当然我觉得各位在看我的算法之前自己动手写写应该也是有提高的,最好是用记事本写,然后直接Copy到IDE中测试,看看离开了Intelligence还能不能直接Run的.阅读全文
posted @ 2011-04-16 21:21 Dennis.Yang 阅读(524) 评论(5) 编辑
  2010年9月2日

小软开发手记 (请移步 http://www.cnblogs.com/flashbar/archive/2012/01/04/MyGenerator.html 获取最新版本)

先讲讲开发目的:为了不再很机械的复制粘贴复制再粘贴,往返于VS和SQL中间,于是上网找有没有自动生成实体类的东西。找了一圈,发现有是有,不过都不是自己需要的,有的功能太强,有的界面不够简洁,其实我要求的功能挺少挺简单的,但是就是找不到,很郁闷~ 于是决定自己花点时间写一个。

  刚开始的目的仅限于此,后面慢慢说开发过程,遇到的问题和解决方案,希望这个软件可以给大家带来方便,开发过程中的一些经验也对大家有帮助。

第一天

我做的事情:

1. 软件的架构工作,汇报如下:

软件需求:(1)根据用户输入的DB Server的信息(IP,User,Password)自动获取Server上的DB列表(有改进)

     (2)根据用户选择的DB,读出所有的Table和对应Table上的所有字段,做成List (有改进)

     (3)根据用户单击的的Table自动生成该Table的实体类(有改进)

开发环境和语言: VS2010, C#, WPF

2. MainWindow的Layout设计和Coding

这部分为需求(1),刚开始想的简单,拖几个TextBox然后让用户输入一些信息,然后再把得到的数据库绑定到一个Combobox就算OK。于是开始做界面。

这部分的主要代码如下:

读取所有数据库
string connStr ="";
if (ChkIsWindows.IsChecked !=true)
{
connStr
=string.Format(
"Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID={2};Password={3}",
dataSource, inCa, uid, pwd);
}
else
{
connStr
=string.Format(
"Data Source={0};Initial Catalog={1};Trusted_Connection=SSPI", dataSource,"Master");
}
_sqlstr
="Select Name From Master..sysdatabases";
return SqlUtility.GetDataTableBySqlStr(connStr, _sqlstr, out errMsg);

如上,第一个分支判断是否为使用系统验证的,两种登入SQL Server的方式,连接字符串是不同的。

做完了后的界面如下:

怎么样? 还比较清爽吧? 选中第一个复选框会自动带出DB Server 和 Login ID, Password也不用填了。

第二天

我做的事情:

1. 主窗口,用作自动生成代码的界面设计

2. 需求(2)的功能实现和软件性能优化,如何能快速的读出远程

这部分是主要部分,良好的用户体验是必不可少的,开始的想法太简单,并且不易用,因为肯定有很多人想一次生成很多Table的实体,或者只想为部分字段做属性。

于是我决定使用TreeView空间,Table作为主节点,字段作为子节点。然后在每个节点处加入CheckBox用来限制选定与否。这些都是在程序中控制的。

3. 初始化一个Tab用来放置文本模板,这样用户就可以自定义文本生成模板了,使用范围就更广了(今天刚发现,这个用来把读取的DataSet中的Column数据都赋值到对应的实体中也是很方便的)

主要代码如下:

初始化TreeView
#region Init TreeView
privatevoid InitDtList()
{
string errMsg;
DataTable tbList
= GetTbList(out errMsg);
if (!string.IsNullOrEmpty(errMsg))
{
TxtNote.Text
= errMsg;
return;
}
if (tbList !=null&& tbList.Rows.Count >0)
{
TrvTbList.Items.Clear();
for (int i =0; i < tbList.Rows.Count; i++)
{
CheckBox cb
=new CheckBox
{
Content
= tbList.Rows[i][0].ToString(),
Tag
= i
};
cb.Click
+= CbTable_Click;

TreeViewItem tvItem
=new TreeViewItem
{
Header
= cb,
};
TrvTbList.Items.Add(tvItem);
InitColumnList(tvItem, tbList.Rows[i][
0].ToString());
}
}
else
{
TxtNote.Text
=string.Format("No Table in DataBase: {0}", Program.SelectedDb);
}
}
privatevoid InitColumnList(TreeViewItem tvItemHeader, string dtName)
{
string errMsg;
DataTable columnList
= GetColumnList(dtName, out errMsg);
if (!string.IsNullOrEmpty(errMsg))
{
TxtNote.Text
= errMsg;
return;
}
if (columnList !=null&& columnList.Rows.Count >0)
{
tvItemHeader.Items.Clear();
for (int i =0; i < columnList.Rows.Count; i++)
{
string[] types = Program.GetTypeById(columnList.Rows[i][1].ToString());
CheckBox subCb
=new CheckBox
{
Content
=string.Format("{0} (SQL: {1})", columnList.Rows[i][0], types[0]),
Tag
= types,
ToolTip
= columnList.Rows[i][0]
};
TreeViewItem tvSubItem
=new TreeViewItem
{
Header
= subCb,
ToolTip
="C#: "+ types[1]
};
tvItemHeader.Items.Add(tvSubItem);
}
}
}
private DataTable GetTbList(outstring errMsg)
{
_sqlstr
="Select Name From SysObjects Where XType='U' order By Name";
return SqlUtility.GetDataTableBySqlStr(Program.Connstr, _sqlstr, out errMsg);
}
private DataTable GetColumnList(string dtName, outstring errMsg)
{
_sqlstr
=
string.Format(
@"select sc.name as Name,sc.xtype as Type from syscolumns sc,sysobjects so
where sc.id = so.id and so.name = N'{0}'
", dtName);
return SqlUtility.GetDataTableBySqlStr(Program.Connstr, _sqlstr, out errMsg);
}

然后就是根据用户的选择自动生成代码了,这里我用了TabControl空间,然后动态添加TabItem。代码如下:

添加Tab
#region Add Tabs
privatevoid AddEntityTabsByTreeView(TreeView tv)
{
string tempStr = ((TextBox)tabItem0.Content).Text;
foreach (var item in tv.Items)
{
string entityStr ="";
CheckBox cb
= ((TreeViewItem)item).Header as CheckBox;
if (cb !=null&& cb.IsChecked ==true)
{
foreach (var subItem in ((TreeViewItem)item).Items)
{
CheckBox subCb
= ((TreeViewItem)subItem).Header as CheckBox;
if (subCb !=null&& subCb.IsChecked ==true&&!string.IsNullOrEmpty(tempStr))
{
entityStr
+= tempStr.Replace("%ColummName%", subCb.ToolTip.ToString()).Replace("%ColummType%",
((
string[])subCb.Tag)[
1]) +"\n";
}
}
if (!string.IsNullOrEmpty(entityStr))
{
TabItem tabItem
=new TabItem { Header = cb.Content };
TextBox tb
=new TextBox { Text = entityStr };
tb.TextWrapping
= TextWrapping.Wrap;
tb.AcceptsReturn
=true;
tb.VerticalScrollBarVisibility
= ScrollBarVisibility.Visible;
tabItem.Content
= tb;
TabEntity.Items.Add(tabItem);
}
}
}
}
#endregion


做完了后的界面如下:

注意,这里我是使用一个xml文件来做类型映射的,第二天完工...

第三天

我做的事情:

1. 加入了一些常用功能,比如后退,退出,重置,当前Tab的文本Copy等等

2. 页面控件的重新布局

3. 加入了错误信息的提示

4. 重头戏,程序代码的优化,使用了少少的全局变量,从而大量减少了远程连接时的超时现象

得到SQL中和.Net中的对应数据类型
publicstaticstring[] GetTypeById(string typeId)
{
if (TypeDic ==null||!TypeDic.ContainsKey(typeId))
{
string mapFile ="TypeMap.xml";
DataSet ds
=new DataSet();
ds.ReadXml(mapFile);
if (ds.Tables["type"] ==null&& ds.Tables["type"].Rows.Count <=0)
{
returnnull;
}
TypeDic
=new Dictionary<string, string[]>();
for (int i =0; i < ds.Tables["type"].Rows.Count; i++)
{
string[] dataTypes =newstring[2];
dataTypes[
0] = ds.Tables["type"].Rows[i][0].ToString();
dataTypes[
1] = ds.Tables["type"].Rows[i][2].ToString();
if (!TypeDic.ContainsKey(ds.Tables["type"].Rows[i][1].ToString()))
{
TypeDic.Add(ds.Tables[
"type"].Rows[i][1].ToString(), dataTypes);
}
}
}
return TypeDic[typeId];
}

5. 使用Config文件,便于用户的配置

好了,完工了,就说到这,希望对大家有用。

基本功能:
        1. 根据需要自动生成实体类
        2. 自动生成存储过程,包含每个表(Table)的基本SQL查询语句
        3. 自动生成WEB层前后端相关代码
        4. 自动生成BLL层的几个基本业务操作的代码
        5. 数据库操作支持T-SQL事务,设置简单
        6. 支持模板自定义,生成你想要的代码片段
        7. 单文件绿软,便于携带

运行环境:
        1. Win XP/2003/2008/Vista/Win7
        2. .Net Framework 3.0/3.5/4.0

更新历史:

   最后更新日期: 2011/12/20
        V3.2.0.0
        修改:BLL层代码根据Table自动生成,更加符合面向对象的原则
        修改:WEB前端方法调用更加简单
        修改:修复已知的几个代码生成错误的问题
        修改:Web后台代码调整,更加通用
   V3.1.0.0
        增加:代码生成时对非主键自增字段的处理逻辑
        增加:增加对中文字段和中文数据库名的支持
        修改:存储过程中用中括号括起字段名,避免冲突
        修改:存储过程中增加唯一性确定过程,后端代码在插入和更新的过程中加入唯一性判断的事务
        修改:说明性文字部分修改和修正
        V3.0.0.0
        增加:界面布局调整,更加符合用户体验
        增加:界面切换效果
        修改:取消BLL和DAL层得代码自动生成,改为通用类,无需根据数据表生成
        修改:大幅修改代码生成,支持使用多数据库操作的T-SQL事务,整个数据库访问流程更加灵活,支持数据库操作的智能提示
        修改:修复已知的几个代码生成错误的问题
        V2.1.0.0
        增加:全面支持SQL Server 2008 R2
        修改:修复两个已知会造成程序退出的Bug
        V2.0.0.0
        增加:BLL,DAL,WEB层的自动代码生成
        增加:“关于”和“帮助”页面
        修改:软件正式更名为 我的代码生成器(My Generator)
        修改:布局调整
        V1.8.0.0
        优化:一些用户体验的调整,切换功能自动生成对应代码,字段列表选择更加符合用户体验
        修改:修复一个生成的代码中,如果有DateTime类型,那么默认空值存入数据库可能会溢出的错误
        修改:增加某些字段类型的精度显示
        修改:登录窗口的服务器和数据库名支持手动输入
        修改:布局调整,增加反选按钮
        V1.7.0.0
        增加:DB Server的别名功能,可以为同一个DB Server 设置不同的登录账户;
        优化:改进默认本地网站,兼容SQL2005/SQL2008;
        修改:布局调整,可以最小化窗口;
        V1.6.0.0
        增加:增加多个可自动生成项;
        修改:所有可设置部分整合到一个Config.xml中;
        修改:布局调整;
        V1.5.0.0
        增加:支持自己导入数据库列表;
        优化:优化了代码,现在远程连接速度大幅度提高;
        修改:更新了SQL代码生成规则;
        修改:完善了C#实体类和存储过程的生成方案;
        修改:布局调整;
        V1.4.0.0
        增加:可以自动生成每个Table的基本SQL查询语句。
        V1.3.0.0
        优化:代码优化,调整界面和模板内容;
        修改:软件语言中文化;
        V1.2.0.0
        增加:增加了两个模板;
        优化:代码优化,修复一些Bug;
        V1.1.0.0
        优化:代码优化,加快远程连接的速度;
        修改:修复一些Bug,调整界面;
        V1.0.0.0
        增加:提供最基本的实体类生成;

最新版本获取地址:
http://www.cnblogs.com/flashbar/archive/2012/01/04/MyGenerator.html

http://www.flashbar.com.cn

有任何问题都可以联系我

QQ:12811951

Email:duluohua#hotmail.com

最后更新日期  2011/2/9 19:45

posted @ 2010-09-02 22:06 Dennis.Yang 阅读(2196) 评论(22) 编辑
  2010年8月27日

天气预报Web服务,数据来源于中国气象局 公用事业
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

中国股票行情分时走势预览缩略图 
http://www.webxml.com.cn/webservices/ChinaStockSmallImageWS.asmx

中国股票行情数据 WEB 服务(支持深圳和上海股市的基金、债券和股票)
http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx

国内飞机航班时刻表 WEB 服务 公用事业
http://www.webxml.com.cn/webservices/DomesticAirline.asmx

中国电视节目预告(电视节目表) WEB 服务 公用事业
http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx

火车时刻表   (第六次提速最新列车时刻表) 公用事业
http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx

中文 <-> 英文双向翻译 WEB 服务 获得标准数据
http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx

验证码图片 WEB 服务 支持中文、字母、数字 图像和多媒体
http://www.webxml.com.cn/WebServices/ValidateCodeWebService.asmx

中国邮政编码 <-> 地址信息双向查询/搜索 WEB 服务 获得标准数据
http://www.webxml.com.cn/WebServices/ChinaZipSearchWebService.asmx

IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) 获得标准数据
http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx

国内手机号码归属地查询

http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx

外汇-人民币即时报价

http://webservice.webxml.com.cn/WebServices/ForexRmbRateWebService.asmx

腾讯QQ在线状态 WEB 服务

http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx

中文简体字<->繁体字转换 WEB 服务
http://webservice.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx

IP地址搜索 WEB 服务包含中国和国外已知的IP地址数据,是目前最完整的IP地址数据,记录数量现已超过37万条并还在不断更新和增加中
http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx

posted @ 2010-08-27 16:52 Dennis.Yang 阅读(128) 评论(0) 编辑
  2010年7月22日
摘要: 5.提取主类:提取一个基类,抽象出共有方法,比较常用的重构,这里的基类也许并不存在,需要自己新建立。 用法场景:当有一个类中的某个方法需要经常被其他的类调用的时候,说明这个方法重用率很高,可以考虑把它抽象出来,放到一个基类中。代码6.提取子类:将基类中的方法放到子类中,这里的子类也许并不存在,需要自己新建立。 用法场景:当基类中的某些方法并不是面向所有或者大多数类的时候,需要把这些方法下放到子类中...阅读全文
posted @ 2010-07-22 15:52 Dennis.Yang 阅读(106) 评论(0) 编辑
  2010年7月19日
摘要: 一个男人在外工作20年,终于要回家了,老板问他:你是要20年的工资还是要3句忠告?男人说我明天上路,明早给您答案好吗?老板说可以。当晚男人未眠…早晨,他对老板说:我要3个忠告。 于是老板给他3句话。 一、不要试图寻找不可能的捷径,世上没有便宜的事,只有脚踏实地才是最好的方法…无论做何事。   二、不要对明知不是好事的事过分好奇,有可能你会因此而丧命。   三、不要在冲动...阅读全文
posted @ 2010-07-19 23:18 Dennis.Yang 阅读(384) 评论(10) 编辑
摘要: 本问主要讲几个涉及到继承方面的重构,继承一般会涉及到抽象类,接口,我们通常把有相似Func的类提取同类项,也就是抽象出接口或者抽象类;这样做的好处不言而喻,可以方便的扩展,修改,维护子类的共有方法,属性,索引等等。使用基类不仅仅是把各个子类联系起来了,更是降低了各个子类间的耦合度,再次体现了面向接口、继承编程的思想。1.提升方法:指将方法向继承链的上层迁移的过程。用法场景:当子类A中的一个方法需要...阅读全文
posted @ 2010-07-19 15:40 Dennis.Yang 阅读(122) 评论(0) 编辑
  2010年7月14日
摘要: &g  划分职责:根据方法实现的逻辑来安排方法所在的类。  举例理解:这个重构的方法是对单一职责原则(SRP)的贯彻,在Coding的时候,我们不仅仅需要把方法中的逻辑单一化(主要使用 Extract Method),还要把类中的方法安置合理化。比如说有个Book()的类,那么对于Book的一些操作,如增加减少书,设置书的属性那可以交给这个类做;而如另一些方法,如买书,租书就可以交给Cus...阅读全文
posted @ 2010-07-14 16:48 Dennis.Yang 阅读(187) 评论(4) 编辑
  2010年7月13日
摘要: 提取工厂类:使用一个简单工厂类来新建对象实例。举例理解:对于一个客户端事件,我们可能需要初始化一个对象实例,并调用其中的几个方法做一系列的操作。如果客户端事件经常需要扩展,那可能每次初始化的对象实例可能都是不同的,那么为了把这个初始化对象的动作封装起来,为了使这个行为更加便于维护,我们就需要把初始化对象的动作交给简单工厂类来统一完成。项目实例:做过一个小型的购物商城。其中有个需求简述如下:管理员可...阅读全文
posted @ 2010-07-13 15:39 Dennis.Yang 阅读(197) 评论(2) 编辑
  2010年7月12日
摘要: 提取接口:当有多余一个类使用另外一个类中的方法时,可以考虑引入接口,解除这种依赖。举例理解:比如说类A中有个方法为Call(Type T),类B和类C中都有方法都要调用Call这个方法,那么我们推荐引入一个接口,这样传参时可以直接new一个接口,可以解除调用方法和实现方法之间的耦合关系。面向接口编程也算是OO中比较重要的吧。项目实例:一般而言在设计的时候,对于比较可能扩展的部分都会用接口或者是抽象...阅读全文
posted @ 2010-07-12 15:32 Dennis.Yang 阅读(260) 评论(1) 编辑
  2010年7月7日
摘要: 使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型检查相关的程序段,如 if(type == typeof(TypeA)){...}else if(type == typeof(TypeB)){...},可以把{...}中的Code,尝试放到if的条件...阅读全文
posted @ 2010-07-07 16:56 Dennis.Yang 阅读(196) 评论(0) 编辑
  2010年7月2日
摘要: 封装集合:将集合中的某些方法封装起来,这些方法一般会牵扯到其他的逻辑。  举例理解:比如你给一个List<T>里面加一个对象的同时,可能还有一个计数器在计算List中对象的个数,我们不用暴露计数器,这样List.Add()和List.Remove()我们就可以封装起来了。  项目实例:我记得我有个项目需要不断的从数据库中读取User的Guid然后狂发Mail。开始的想法很简单,根据Wi...阅读全文
posted @ 2010-07-02 15:29 Dennis.Yang 阅读(338) 评论(1) 编辑
  2010年7月1日
摘要: 首先承认,我不是牛人,并且距牛人也差的很远。虽然有三年多的.Net开发经验和若干年的Front-End开发经验,但是对于.Net,当然也可以说是C#,了解的并不多。由于所在公司的原因,我在从第一家软件公司跳槽后基本就是处于吃老本的姿态。因为对于我现在的公司而言,项目的稳定性是第一位的,至于Project架构的如何合理,Code写的多美,设计模式用的多精妙,页面是不是标准化,我们的老大完全不Care...阅读全文
posted @ 2010-07-01 20:50 Dennis.Yang 阅读(140) 评论(1) 编辑
  2010年6月27日
摘要: 估计有很多人没有搞清楚,包括我自己,也是搞不大清,找了篇文章,大家随便看看,概念性问题,一看就明白的。1 .NET是一个平台,一个抽象的平台的概念。  .NET平台其本身实现的方式其实还是库,抽象层面上来看是一个平台。  个人理解.NET核心就只是.NET Framework。  .NET Framework包括了两个关键组成元素:  Common Language Runtime, 公共语言运行...阅读全文
posted @ 2010-06-27 22:42 Dennis.Yang 阅读(230) 评论(1) 编辑
摘要: 引子:某年某日,公司Web程序被注入,导致数据库一塌糊涂。CIO大怒,要求以后所有数据库的交互行为都只能用SP,于是乎,即使是没有任何参数的一条查询语句也必须去到DB中加一条SP...  项目实例:新入手一个项目,业务流程比较复杂,数据库交互很多,一条条的SP写的煞是烦人,尤其是在DAL中设置Command的Parameters,繁琐而又费眼睛,写多了很容易出错,因为不仅仅要考虑参数的个数,而且要...阅读全文
posted @ 2010-06-27 14:28 Dennis.Yang 阅读(460) 评论(8) 编辑
仅列出标题