现在越来越多人发现了面向对象和强类型在程序设计和系统实现中的重要性,我们这里绕开理论知识,来看看面向对象数据访问的基本实现。
一、表设计
使用GUID作为数据主键可以保持数据的唯一性(即使名称和编号改变仍可唯一识别)、隐密性;为了保持数据更新的一致性和原子性,我们增加UpdDateTime字段作为更新时间戳,如果你取得的数据为第1版本,在你更新前有人将其更新为第2版本,我们则根据版本判断要不要更新,UpdDateTime字段就起了这样的作用;UpdUserUID用来标识更新此数据的更新者。
则我们设计一个简单的包含以上三个必须字段以及业务名称和编码:
CREATE TABLE [dbo].[Test](
[TestUID] [uniqueidentifier] NOT NULL,
[TestName] [nchar](10) NULL,
[TestCode] [nchar](10) NULL,
[UpdDateTime] [datetime] NULL,
[UpdUserUID] [uniqueidentifier] NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[TestUID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
二、维护数据的一致性信息
对应上面的表,我们可能在系统中有一个简单实体对象类(SEO)与之对应,如:
public class TestSEO
{
public Guid TestUID { get; set; }
public String TestCode { get; set; }
public String TestName { get; set; }
public DateTime UpdDateTime { get; set; }
public Guid UpdUserUID { get; set; }
}
然后我们要考虑如何维护数据的一致性信息,上面表定义中有两个字段与数据的一致性有关系:
1.主键GUID字段标识数据的唯一性;
2.更新时间戳标识数据为当前数据;
那我们便要在数据与实体间保持一致性信息,如何做到这一点呢?我们需要考虑到除查询外的三种数据操作场景:
1.数据的插入:如何产生主键GUID和更新时间戳字段;
2.数据的更新:因为主键GUID字段和更新时间戳字段已从数据库中查询出来,如何根据更新时间戳字段判断是否更新并返回更新时间戳字段;
3.数据的删除:与场景2情况一样,但不用考虑返回更新时间戳字段;
根据这些需求,如下的SQL语句就可以解开大家的疑惑:
1) 数据插入
--Declaration
declare @ReturnUpdDateTime datetime
declare @TestUID uniqueidentifier
declare @UserUID uniqueidentifier
--Input Parameters
set @TestUID=‘‘D1AE3780-57A3-4F16-8C8E-7223634FE228‘‘
set @UserUID=‘‘5C6A9251-9507-4780-85DF-E6B97852B67B‘‘
--Insert Operation
insert into Test(TestUID,TestName,TestCode,UpdDateTime,UpdUserUID)
values(@TestUID,
‘‘TestName1‘‘,
‘‘TestCode1‘‘,
getdate(),
@UserUID);
select @ReturnUpdDateTime=UpdDateTime
from Test
where TestUID=@TestUID;
--Return Parameter
select @ReturnUpdDateTime;
2)数据更新
--Declaration
declare @ReturnUpdDateTime datetime
declare @TestUID uniqueidentifier
declare @UserUID uniqueidentifier
declare @UpdDateTime datetime
--Input Parameters
set @TestUID=‘‘D1AE3780-57A3-4F16-8C8E-7223634FE228‘‘
set @UserUID=‘‘5C6A9251-9507-4780-85DF-E6B97852B67B‘‘
set @UpdDateTime=‘‘2010-01-02 23:05:15.753‘‘
--Update Operation
update Test set TestName=‘‘TestName2‘‘,
TestCode=‘‘TestCode2‘‘,
UpdDateTime=getdate(),
UpdUserUID=@UserUID
where TestUID=@TestUID AND UpdDateTime=@UpdDateTime
select @ReturnUpdDateTime=UpdDateTime
from Test
where TestUID=@TestUID;
--Return Parameter
select @ReturnUpdDateTime;
大家会发现更新SQL语句第一次执行更新了一条记录,而第二次却没有更新,原因是第一次更新后UpdDateTime字段被更新,更新条件不再有效,这也就是我们用来进行数据一致性检验的最好方法,减少了数据库再次往返检查的徒劳。
3)数据删除
因为数据删除与数据更新原理相同这里就不再给出SQL示例。
对于数据库表对应的实体数据类的代码,建议大家使用代码生成工具生成,都会有很好的效果。但在实际的开发过程中仍有空值问题、全字段检索和部分字段检索等问题会困扰我们,在以后的随笔中我将与大家分享,也希望大家多提宝贵意见。
讲师:don 浏览数:25
讲师:don 浏览数:101
讲师:don 浏览数:264
讲师:don 浏览数:70
讲师:don 浏览数:79
讲师:don 浏览数:95
讲师:don 浏览数:192
讲师:don 浏览数:151