posts - 155,comments - 141,trackbacks - 5

前段时间接到一个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 阅读(644) 评论(6)  编辑 收藏 网摘

FeedBack:
2007-02-25 18:05 | JesseZhao      
不错
  回复  引用  查看    
#2楼[楼主]
2007-02-25 23:15 | jchdong      
呵呵,谢谢Jesse 的鼓励,这些内容是下午今天下午写好的,没有细看,晚上看看还有些写得不通,准备再改改

还有2部分准备写
二 是编写经验的总结
三 是配置入门,发布,测试

  回复  引用  查看    
2007-02-26 09:32 | 想飞的猪      
恩恩,继续继续,等着呢
小建议:代码可以考虑用编辑器的Code模式发布,会清楚一点

  回复  引用  查看    
#4楼[楼主]
2007-02-27 00:26 | jchdong      
谢谢,想飞的猪
我已经修改过了为code模式

  回复  引用  查看    
2007-02-28 09:59 | 在北京的湖南人      
支持,我现在项目之外全力学习这个,这个东西对t-sql对于过程处理的不足作了很好的弥补,因为t-sql主要是针对查询的语言,不是过程的语言,比如你格式化一个日期,在t-sql中要很复杂的表达,但是使用clr的话,就是一行能搞定的了。
希望能和您多多交流

  回复  引用  查看    
#6楼[楼主]
2007-02-28 12:54 | jchdong      
to:在北京的湖南人

其实sql也好格式化日期,但是sql提供的函数,和存储过程确实没有CLR的丰富,同时也不用了解2种语言对于格式化的处理,提高开发效率.

另很高兴认识你,你可以加我msn和我讨论这些问题

msn:jiangchuandong@hotmail.com

  回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 656286




相关文章:

相关链接: