好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

自定义表主键

自定义表主键

asp.net自定义表主键解决方案(附代码Demo实战)

概述

一般情况下我们在设计表时主键都是自增长的,我们都是采用数据库本身提供的主键自增机制,Sqlserver一般是用IDENTITY(1,1)这个来标识,Oracle一般是用触发器,在大多数应用场景下这些机制基本上是够用的,但是在某些场景下如果需要自定义主键生成机制,例如生成L0000001、010001、000001等这些主键,利用关系数据库本身的机制就满足不了了。

这里介绍一种能够灵活定制主键的方式,它主要通过一定的生成机制来生成符合要求的主键,这里拿一个主键值初始化值来介绍:

主键初始化值

前缀

长度

备注

L0000001

L

7

 

010001

01

4

 

000001

 

6

 

 

需求分析及设计

 

功能

质量

约束

组织、用户、开发

1、 主键灵活定制;

2、 主键生成表数据结构设计;

3、 主键生成调用接口API封装;

 

1、 安全性;

2、 通用性;

3、 性能;

4、 灵活性;

1、 读写线程问题;

2、 无需额外配置,自动记录主键最大值;

 

数据结构设计

名称

代码

注释

数据类型

长度

是否主键

表名称

GC017_Table_Name

 

varchar(100)

100

TRUE

前缀编码

GC017_Parent_Code

 

varchar(20)

20

TRUE

编码级别

GC017_Code_Level

 

varchar(20)

20

TRUE

最大编码

GC017_Max_Code

 

varchar(20)

20

FALSE

列名称

GC017_Column_Name

 

varchar(20)

20

TRUE

列类型

GC017_Column_Type

 

varchar(10)

10

FALSE

 

代码赏析

1、核心代码主要有两个:ITableCode接口和它的实现类TableCode,调用方式如下:

    ITableCode tablecode =  new   TableCode();
              //   模式1:生成主键id,参数依次为表名称、主键、主键生成长度,传入6表示000001 
             string  id = tablecode.NewCode( "  tableName  " ,  "  column  " ,  "  6  "  );
              //   模式2:生成主键id,表示0010001 
            id = tablecode.NewCode( "  tableName  " ,  "  column  " , "  2  " , "  001  " , "  4  " ); 

 

2、TableCode中的生成编码的核心方法:

核心代码

  private   static   readonly  ReaderWriterLock l =  new   ReaderWriterLock();
          private   static   readonly   string  prefix =  string  .Empty;
          ///   <summary> 
         ///   根据规则生成主键Tablecode
          ///   </summary> 
         ///   <param name="pTblName">  表名称  </param> 
         ///   <param name="pColumn">  列名称  </param> 
         ///   <param name="pLevel">  级别默认为空  </param> 
         ///   <param name="pParentCode">  前缀  </param> 
         ///   <param name="pLength">  长度  </param> 
         ///   <returns></returns> 
         public   string  NewCode( string  pTblName,  string  pColumn,  string  pLevel,  string  pParentCode,  string   pLength)
        {
              try  
            {
                l.AcquireWriterLock(Timeout.Infinite);
                  if  (pParentCode.Equals( string  .Empty))
                    pParentCode  =  "  0  "  ;
                  if  (pLevel.Equals( string  .Empty))
                    pLevel  =  "  1  "  ;
                ArrayList objList;

                objList  =  GetData(pTblName, pColumn, pLevel, pParentCode);
                  if  (!pLevel.Equals( "  1  "  ))
                {
                      if  (!pParentCode.Equals( "  0  "  ))
                    {
                          if  (objList.Equals( null  ))
                        {
                              string  newcode = pParentCode + IncCode( string  .Empty, pLength);
                            InsertData(pTblName, pColumn, pLevel, pParentCode, newcode);
                              return   newcode;
                        }
                          if  (objList.Count ==  0  )
                        {
                              string  newcode = pParentCode + IncCode( string  .Empty, pLength);
                            InsertData(pTblName, pColumn, pLevel, pParentCode, newcode);
                              return   newcode;
                        }
                          if  (objList.Count ==  1  )
                        {
                              string  newcode = IncCode(((TableCodeInfo)objList[ 0  ]).MaxCode, pLength);
                            SetData(pTblName, pColumn, pLevel, pParentCode, newcode);
                              return   newcode;
                        }
                    }
                }
                  if  (objList.Equals( null  ))
                {
                      string  newcode = IncCode( string  .Empty, pLength);
                    InsertData(pTblName, pColumn, pLevel, pParentCode, newcode);
                      return   newcode;
                }
                  if  (objList.Count ==  0  )
                {
                      string  newcode = IncCode( string  .Empty, pLength);
                    InsertData(pTblName, pColumn, pLevel, pParentCode, newcode);
                      return   newcode;
                }
                  if  (objList.Count ==  1  )
                {
                      string  newcode = IncCode(((TableCodeInfo)objList[ 0  ]).MaxCode, pLength);
                    SetData(pTblName, pColumn, pLevel, pParentCode, newcode);
                      return   newcode;
                }
            }
              finally  
            {
                l.ReleaseWriterLock();
            }
              return   string  .Empty;
        }  

 

这里用到了多线程的ReaderWriterLock,方法中调用l.AcquireWriterLock(Timeout.Infinite);这样就可以保证读的时候是多线程,写的时候是单线程,避免了主键错乱的问题;

代码完整Demo下载: SystableCode.rar

开发人员为什么要选择APL(抽象编程语言)平台?

   昨天我同学问到开发人员为什么要选择APL(抽象编程语言)平台的尖锐问题,  我反思了我在博客上的文章更多是在介绍APL(抽象编程语言)平台的例子和思想.  没有很简要直接描述开发人员选择APL(抽象编程语言)平台 的理由, 特以此文章讲解开发人员选择APL(抽象编程语言)平台的理由.

   以下是我整理的开发人员选择APL(抽象编程语言)平台的理由:

一.  APL(抽象编程语言)平台是 一个 小巧但完整的开发平台 , 可以用做桌面应用开发和Web应用开发.   

    A.  可以利用apl脚本写 HTTP服务端页面, 类似php之类语言的开发.

       APL(抽象编程语言)平台提供了aplHttpServer.exe程序,  这是一个小的, 支持apl脚本写Web服务端页面(aplx)的工具.

    B.  APL(抽象编程语言)平台的 深思(Deepthink)浏览器中在 javascript中 全面支持了 apl脚本调用和APL方法调用,  这使得 HTML页面在本地应用中获得更多的能力.

        APL平台封装到 javascript的接口是 /system/jsAplInterface.js,  这部分完全开源并可免费使用.

   C.  APL(抽象编程语言)平台的 深思(Deepthink)浏览器中 也支持SCADA画面.

          SCADA画面是 以 apl脚本(包括画图方法) + 页面描述语言 的 组态功能, 这可以补充HTML页面不太适合实现的画面.  

二.   APL(抽象编程语言)平台是 一个学习成本低, 容易上手, 接口扩展而保持不变性的 开发平台.

               作者设计APL(抽象编程语言)平台的意图就是让编程工作 回归到简单自然的方式, 并 让接口基于抽象类型,  以让接口可以以兼容和扩展形式发展 , 让开发人员可以最轻松上手而又不会过时

( 就象人类的语言发展一样).

               APL(抽象编程语言)平台的 apl脚本 可以用于 Web服务端开发, 又可用于javascript中的开发, 又能用于SCADA中的开发, 还能用于控制台程序开发,   这种在各个应用中都能统一使用apl脚本这点,

完全超出了作者开始设计和开发此平台的预期.

三.  APL(抽象编程语言)平台是 一个多层次开放的 开发平台.

     

    A.  应用的最前端开发人员可以用apl脚本写 Web服务端页面, 基于jsAplInterface.js可以 直接在 javascript中调用 apl脚本和APL平台方法.

    B.  更深层次的开发人员可以用C++写 基于APL接口的模块和方法, 非常容易把应用的东西放入到APL平台的接口中.

四.   APL(抽象编程语言)平台提供齐备的免费工具 帮助开发人员开发.

    A.  小巧的支持 apl脚本的 Web服务器:   aplHttpServer.exe 

    B.  深思(DeepThink)浏览器:        aplBrowser.exe 

       支持 (apl脚本扩展的)Web页面 和 SCADA页面,  上网浏览页面和本地应用高度集成的 工作平台.

   C. APL平台的控制台程序:         aplConsole.exe  

      D. SCADA的可视化设计工具:        aplSCADA_Tool.exe              

      E. apl脚本的测试工具:           aplScriptTool.exe       

   目前APL(抽象编程语言)平台还在alpha开发阶段,  作者希望更多的开发人员能够了解和喜欢APL(抽象编程语言)平台,  如果你想了解更多APL(抽象编程语言)平台的信息和体验一下

APL(抽象编程语言)平台中的开发和应用, 请在此文章后留下您的电邮, 作者会把此包发给您, 多谢!

paul

 

                 

            

  

   

 

开发人员为什么要选择APL(抽象编程语言)平台?

摘要: 本文讲述APL(抽象编程语言)平台对开发人员的价值和作用. 阅读全文

posted @  2013-03-20 17:50  smartfish_liu 阅读(486) |  评论 (0)   编辑

抽象编程语言(APL)设计基础

摘要: 介绍APL的设计基础 阅读全文

posted @  2012-06-09 21:18  smartfish_liu 阅读(157) |  评论 (0)   编辑

抽象编程语言(APL)开发架构

摘要: 介绍APL开发架构 阅读全文

posted @  2012-06-09 21:16  smartfish_liu 阅读(221) |  评论 (0)   编辑

抽象编程语言(APL)架构

摘要: 描述APL架构 阅读全文

posted @  2012-06-09 21:14  smartfish_liu 阅读(183) |  评论 (0)   编辑

为什么要开发抽象编程语言(APL)?

摘要: 介绍为什么要开发APL平台. 阅读全文

posted @  2012-06-09 21:12  smartfish_liu 阅读(78) |  评论 (0)   编辑

抽象编程语言(APL)是什么?

摘要: 本文介绍APL是什么东东. 阅读全文

posted @  2012-06-09 21:07  smartfish_liu 阅读(93) |  评论 (0)   编辑

 

 

分类:  APL

 

 

 

 

 

 

 

 

 

标签:  表主键生成 ,  主键机制 ,  数据库主键

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于自定义表主键的详细内容...

  阅读:42次