日期:2014-05-20  浏览次数:20901 次

ling to sql 如何记录对数据库的更改 (2)
我的环境:winxp, c#2008, sql 2005。数据访问技术:linq to sql 
目前策略思路:系统中有若干个表,包括一个用户表,我在登录的时候记录用户的登录id,然后在每个表里面设置一个用户id的列和一个自动时间戳timestamp,然后在insert和update的时候写入用户id,自动时间戳则把操作的具体时间自动记录,
表的定义如下:
SQL code
create table class
(
    class        nvarchar(10)    not null, --班级
    specialty    nvarchar(40), --专业
    counsellor    nvarchar(12), --班主任
    enroll        int,--入学年份
    userID        int    not null, --操作员
    autoTS        timestamp not null --自动时间戳
)
go
alter table class
    add constraint pkClass primary key (class)
go
alter table class
    add constraint users$op$class foreign key (userID) references users
go


在对这个表维护的时候,操作员和时间戳应该是不可见,由系统自动填充,如下图

在查询的时候应该都显示出来,如下图

在用户维护时候,点保存的处理代码如下:
C# code
private void classesBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            try
            {
                db.SubmitChanges(); //private tuitionDBDataContext db = new tuitionDBDataContext();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

问题:
1、我怎么让用户点保存按钮的时候,获取每一行已经被更改的数据,然后将操作员的id填入userID列?
2、sql里面的自动时间戳timestamp 为什么到这里显示成了这个模样,数据类型也变成了rowversion,怎么让他正确的显示年月日时分秒?

------解决方案--------------------
1 linq生成的实体支持OnCreated,PropertyChanged,PropertyChanging这些方法和事件,我认为可以在这些扩展点上面把用户id填进去
2 timestamp类型的字段不需要写值,数据库自动会填.且一个表应该只有一个类型是timestamp的列
------解决方案--------------------
LINQ会自动产生一个分部函数:OnValidate(),可在此函数中调用内置方法:datacontext.yourTable.GetModifiedMembers()方法获取是否被修改,如:
bool isChange= db.tbA.GetModifiedMembers(tbARecord).Count()!=0;

当isChange为ture时,则设置tbARecord的userID及时间。
------解决方案--------------------
mark
------解决方案--------------------
没研究过这玩意.只能看看.
------解决方案--------------------
还没用过这样的功能,学习学习!