前段时间接到一个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

1/2/3/y/m/d

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)
    {
        SqlCommand InsertCurrencyCommand = SqlContext.GetCommand();
        InsertCurrencyCommand.CommandText = "INSERT INTO table1 (Name, addDate) VALUES ('"+name.Value+"', '" + DateTime.Now.ToString() + "')";
        InsertCurrencyCommand.ExecuteNonQuery();
    }

而正式版的写法是:
    [SqlProcedure]
    public static void InsertData(string name)
    {
        using (SqlConnection myConnection = new SqlConnection("context connection=true"))
        {
            myConnection.Open();
            SqlCommand myCommand = new SqlCommand("insert TestCLR values ('1','"+name+"')",myConnection);
            SqlContext.Pipe.ExecuteAndSend(myCommand);//
        }
    }

开始阅读整理逻辑是比较痛苦的,原来的SQL语句为了生成这些字符样式,用了好多奇怪的用法和IF,主要是为了好配置生成流水号的样式

接下来定义的方法,把以前写在sql的功能抽离出来,生成一个个static的方法,这样抽离后代码结构看起来清爽很多,也可以利用c#中自带的方法,例如正则表达验证什么;
 
下一步是把sql的逻辑转换C#的代码逻辑表现来出来,呵呵,以前要用游标写的地方,现在DataReader就可以搞定了,而且VS2005的智能提示用起来很不错的,代码要写得快得多了,不过这部分的时间比预计要延长了些;比较老火的地方是sqlconnection在存储过程中不能多次new,这样在循环里要做查询的时候就没有办法了,如果有这样的情况只有又在代码里嵌套游标

花了2天时间基本把拼sql和处理代码逻辑的事情搞完了,剩下的是测试和优化效能了

测试的时候,还是比较原始,基本按照功能说明的地方走了一下功能测试,检查了下功能是否满足,最后用sqlserver2005自带的显示客户端统计信息来统计了下最后执行的结果;又修修改改了下,效率方面基本和写存储过程差不多,值的注意的是最后部署要改为Release模式,默认是Debug模式

到了这一步,工作应该进行到80%了吧
最后附开发代码:


  1using System;
  2using System.Data;
  3using System.Data.SqlClient;
  4using System.Data.SqlTypes;
  5using System.Text;
  6using Microsoft.SqlServer.Server;
  7
  8 
  9
 10/************************************************************
 11  Author:  CQ David          Date: 2006-01-24
 12  Description:     //修改獲取流水號存儲過程
 13  History:         
 14             <author>   <time>         <desc>
 15Create      CQ David    2006-01-24       Create,測試微軟msdn例子
 16Modify      CQ David    2006-01-31       定義接口和函數
 17
 18***********************************************************/

 19
 20public partial class StoredProcedures
 21{
 22
 23    GetDocNoComSqlProcedure
 80
 81    Function
758
759
760}
;
761
762
763
764






 

posted on 2007-02-25 17:37  jchdong  阅读(1563)  评论(6编辑  收藏  举报