VS2010中创建自定义SQL Rule

VS2010已经发布几天时间了,一些新的特性特别引人注目,比如:

l         性能的稳定和提升,表现在WPF GUIWPF文本呈现。

l         Windows Azure Tools模板。

l         多显示器支持,输出窗口,类图窗口,代码定义窗口等提供辅助信息的窗口放置在副显示器中。

l         对并行计算开发的大量支持。

l         包含了SharePoint的项目模板和调试支持。

l         用于SilverlightWPF的拖放绑定支持。

l         C++ IDE的增强:通过简单的拖放操作,就能生成稳健的Windows窗体应用程序。

l         通过并行安装以向后兼容.NET 3.5

l         F#语言的支持,JavaScript智能感知引擎等等。

除去以上特性,创建自定义SQL Rule也有所变化。本文就如何在VS2010中创建SQL Rule进行说明 。

1.      什么是Visual Studio Database Edition以及特性。

Visual Studio Database Edition(以下简称VSDB)是针对典型的数据库开发任务而设计的,可以对原有数据库反向工程,添加表,存储过程和其他数据库项目,而且有选择性地将修改部署到目标数据库中。他的主要特性有:

1.1模型对比(Schema Compare

在项目的维护和升级期间,至少需要维护产品数据库(正在正式运营的数据库)、测试数据库、开发数据库这三个数据库,那开发数据库结构变更后,如何同步到其他两个数据库上呢?模型对比功能可以很好地解决此问题。如果开发数据库结构变更,可以通过选择菜单的Data Schema Compare Filter中选择Different Objects, Missing Objects or New Objects来过滤列表。这个过滤可以使我们快速地看到哪些修改需要更新到目标数据库中。然后我们可以保存修改脚本到一个文件中,并在T-SQL编辑器或者直接将修改精写入到目标数据库。

 

1.2数据对比(Data Compare

    用来比较两个数据库的表或者视图中数据是否相同,可进行比较的前提是数据库名称一致、表具有相同的主键、唯一索引或唯一约束。比较完后可以对修改保存到目标数据库或者脚本。这个特性可以将产品数据库的数据导入到开发数据库或者测试数据库,以便于开发和测试。

 

1.3数据生成计划(Data Generation Plans

在项目中,开发团队每周至少一次提交版本到测试环境,测试人员针对新的数据结构如何快速生成测试基础数据呢? 数据生成计划会解决此问题。在数据生成计划计划中,我们要定义生成数据的表、每一个表要生成的记录行数和要插入数据的类型。数字类型比较容易生成,针对特殊的数据比如Email、电话号码可以通过正则表达式RegEx完成。

 

1.4重构(Refactor

    主要用来重命名数据库对象,比如数据库名称,表名称,视图名称。当要重命名的对象改变后,对此对象的引用都会相应地改变。

2.      如何自定义SQL Rule

随着时代的进步及其全球化,企业业务越来越复杂,造成软件项目也越来越庞大,软件开发再也不是单枪匹马的时代,靠一两个人是完成不了任务的,软件工厂模式是一个趋势,软件工厂生产线是一个方向,软件的生成就可以像普通的产品一样,流转过整个生产线后,已经定型并被客户部署上线。庞大的生产线,庞大的队伍,各式各样的编程习惯,如何保证生产线的效率和软件产品质量,无规矩不成方圆,代码编写规范是其中很重要的一个规矩,数据库命名规范也是代码编写规范里面比较重要的组成部分,VSDB可以很好地解决这个问题,强制要求开发人员按照数据库规范来对数据库对象命名。接下来让我们看看如何解决这个问题。

2.1生成强命名类

调用命令行程序(路径=系统盘:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\) sn.exe -k FRIMLEC.text.snk

然后把创建好的FRIMLEC.text.snk加入的工程中。设置参见下图(选中工程右键--Properties--Signning)

 

提示使用强名称对程序集进行签名将向包含程序集清单的文件添加公钥加密。强名称签名帮助验证名称的唯一性,避免名称欺骗,并在解析引用时向调用方提供唯一标识。但是,任何信任级别都不会与一个强名称关联。

 

2.2引入类库

using Microsoft.Data.Schema.Extensibility;

using Microsoft.Data.Schema.SchemaModel;

using Microsoft.Data.Schema.SchemaModel.Abstract;

using Microsoft.Data.Schema.ScriptDom.Sql;

using Microsoft.Data.Schema.Sql.SchemaModel.SqlServer;

using Microsoft.Data.Schema.Sql.SqlDsp;

using Microsoft.Data.Schema.StaticCodeAnalysis;

 

 

2.3定义类

定义了一些类的属性(attributes)。

DatabaseSchemaProviderCompatibility允许用户指定Sql Rule所要应用的SqlDatabase类型,这里使用的是标准SqlDatabase

DataRuleAttirbute用来指定name, id, description等其他规则属性。

SupportedElementTypeAttribute,此属性用来指定要验证的数据库对象,此处要验证的是表字段。

 

2.4构造函数

public MyStylePrefixedTable()

            : base(

         "SqlRule",

         "DD0002",

         "All columns must be in form xxxx_xxxxxxxx",

         "All columns must be in form xxxx_xxxxxxxx where the part befor the _ is table code, and part after is descriptivename",

         "",

         "MyStylePrefixedTable")

        {

        }

定义一些列的命名规则,即4个字母的表名_字段名。

 

2.5新建资源文件

所有传到DataRuleAttribute里面的字符串都需要添加到以上资源文件中。填写资源文件如下图:

 

2.6创建常量类

此处的ResourceBaseName就是资源文件的表名。

2.7重写Analyze方法

public override IList<DataRuleProblem> Analyze(DataRuleSetting ruleSetting, DataRuleExecutionContext context

{

    List<DataRuleProblem> problems = new List<DataRuleProblem>();

 

    IList<string> nameParts = context.ModelElement.Name.Parts;

    IDatabaseColumn column = context.ModelElement as IDatabaseColumn;

    if (column == null)

        return null;

 

    if (nameParts.Count == 3)

    {

        if (!Regex.Match(nameParts[2], @"^w{4}_w*").Success)

        {

            string message = string.Format(

                "Column {0} of table {1}.{2} must have the form pref_columnname.",

                 nameParts[2], nameParts[0], nameParts[1]);

            DataRuleProblem p = new DataRuleProblem(this, message, context.ModelElement);

 

            p.Severity = DataRuleProblemSeverity.Error;

            problems.Add(p);

        }

    }

 

    return problems;

}

 

2.8注册Sql Rule

copy "$(TargetDir)$(TargetName)$(TargetExt)" "$(ProgramFiles)Microsoft Visual Studio 10.0VSTSDBExtensions$(TargetName)$(TargetExt)" /y

 

copy "$(ProjectDir)$(TargetName).Extensions.xml" "$(ProgramFiles)Microsoft Visual Studio 10.0VSTSDBExtensions$(TargetName).Extensions.xml" /y

 

"C:Program FilesMicrosoft SDKsWindowsv7.0ABinNETFX 4.0 Toolsgacutil.exe" /if "$(ProgramFiles)Microsoft Visual Studio 10.0VSTSDBExtensions$(TargetName)$(TargetExt)"

拷贝到Build Events->Pre-build event中,然后编译类库,生成相应的DLL文件,供其项目调用。

 

    至此,在VS2010中定制数据库命名规则的功能完成,再也不用担心开发人员不按照规则开发了,如果出现不按照规则的命名,脚本编译不能通过,并且有提示。

3.      总结

相信VS2010的这些新的特性,以及一些新的开发技巧能够快速提高开发人员的工作效率。对VS2010新版本感兴趣的朋友,可以通过该地址下载:http://www.microsoft.com/visualstudio/zh-cn/products/2010/default.mspx

posted @ 2010-04-19 10:38  灵动生活  阅读(6997)  评论(35编辑  收藏  举报