前段时间接到一个Task,是用CLR来改写现有的生成流水号存储过程,改写的原因主要是因为原的代码逻辑比较复杂,没有人能继续维护,同时也探讨用CLR来编写存储过程的可能性,借以提高开发效率,
接到任务的时候非常高兴,毕竟这个算是业务的一个核心,有一定的难度和挑战;
马上就开始动手准备了;
先是了解这个task的要求功能
里面有3种case,最主要的一个case 是设定有 CommonStartPrefix
CommonStartPrefix 的结构如下
|
TableName |
ColName |
Prefix1 |
Prefix2 |
Prefix3 |
PrefixY |
PrefixM |
PrefixD |
PrefixOrder |
IsAlpha |
ViewRef |
|
使用GetDocNo之Table及Key ColumnName |
前缀值1 |
前缀值2 |
前缀值3 |
yy/yyyy |
m/mm |
d/dd |
|
0/1 流水号会否使用英文字母 |
参考Table/View |
|
根据CommonStartPrefix 的设定值来确定流水的生成流水的值格式
再查询系统表或由传入的参数来生成流水的长度值
最后生成流水号再update记录流水的CommonStart表
举个例来说:
CommonStartPrefix 的值为
CommonStart 的值为
那么选择StartDate为2006-1-18,docLen为10,生成的最后docno为120061J002
1 为Prefix1的值,2006为传入的月份,J为18号,002为查询的CommonStart 的值
了解功能后,然后就开始看以前的存储过程,代码写得有点混乱,看起来sql真是有点痛苦
在痛苦中熬了2天后,终于大概明白了这个存储过程的流程,开始找资料准备了
先后在cnblogs,msdn,和webcast里找来资料,开始弄这个东西了
时间分配是
1 安装开发环境 0.5 day
2 测试msdn 例子 0.5 day
3 理解开发spec和阅读getdocnocom 0.5 day
4 整理开发内容 和 编写测试文档 0.5 day
5 处理接口和运算逻辑 1 day
6 编写字符处理方法 1.5 day
7 自测 和编写测试文档 0.5 day
安排好了就开始一个个干了
安装环境的时候,我先装的是VS2005,再安装的SQLServer2005,后来发现其实安装VS2005其实就可以开发了,使用他自带的SQLEXPRESS就可以了
测试例子最先找的测试例子是ugoer兄的例子:
http://www.cnblogs.com/ugoer/archive/2005/04/01/129986.html
拿来一试编译通不过,后来才看清楚那是beta版的写法,看来正式版和beta版是有差异的
beta版是这样写的
[SqlProcedure] public static void InsertData(SqlString name)
SqlContext.Pipe.ExecuteAndSend(myCommand);//
}
}
开始阅读整理逻辑是比较痛苦的,原来的SQL语句为了生成这些字符样式,用了好多奇怪的用法和IF,主要是为了好配置生成流水号的样式
接下来定义的方法,把以前写在sql的功能抽离出来,生成一个个static的方法,这样抽离后代码结构看起来清爽很多,也可以利用c#中自带的方法,例如正则表达验证什么;
下一步是把sql的逻辑转换C#的代码逻辑表现来出来,呵呵,以前要用游标写的地方,现在DataReader就可以搞定了,而且VS2005的智能提示用起来很不错的,代码要写得快得多了,不过这部分的时间比预计要延长了些;比较老火的地方是sqlconnection在存储过程中不能多次new,这样在循环里要做查询的时候就没有办法了,如果有这样的情况只有又在代码里嵌套游标
花了2天时间基本把拼sql和处理代码逻辑的事情搞完了,剩下的是测试和优化效能了
测试的时候,还是比较原始,基本按照功能说明的地方走了一下功能测试,检查了下功能是否满足,最后用sqlserver2005自带的显示客户端统计信息来统计了下最后执行的结果;又修修改改了下,效率方面基本和写存储过程差不多,值的注意的是最后部署要改为Release模式,默认是Debug模式
到了这一步,工作应该进行到80%了吧
最后附开发代码:
2
3
4
5
6
7
8
9
10