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
2013-3-20
开发人员为什么要选择APL(抽象编程语言)平台?
posted @ 2013-03-20 17:50 smartfish_liu 阅读(486) | 评论 (0) 编辑
为什么要开发抽象编程语言(APL)?
posted @ 2012-06-09 21:12 smartfish_liu 阅读(78) | 评论 (0) 编辑