我在C#应用程序中使用强类型数据集,我希望能够记录用户对行所做的任何更改。这样做的最佳方式是什么?
答案 0 :(得分:0)
您是否希望能够从C#应用程序访问更改?或者这只是为了记录/审计目的?您的强类型数据集是否是映射到SQL Server表的XSD数据集?
在SQL服务器上触发
在我在CB Richard Ellis帮助开发的大型订购系统中,我们创建了额外的表来保存版本化数据。假设您有一个Request表。创建一个Request_changes表。然后为INSERT和UPDATE设置触发器,如下所示:
CREATE TRIGGER [dbo].[tr_Request_update]
ON [dbo].[Request]
FOR UPDATE
AS
SET NOCOUNT ON
INSERT INTO dbo.Request_changes
(
--ID, // taken care of by IDENTITY(1,1)
--LogDate, // uses default value of GetDate()
ChangeAction,
SQLServerUser,
RequestID,
UserIDContact,
etc
)
SELECT
'UPDATE',
system_user,
-- Request fields
RequestID,
UserIDContact,
etc
FROM
inserted
SET NOCOUNT OFF
GO
create TRIGGER [dbo].[tr_Request_insert]
ON [dbo].[Request]
FOR INSERT
AS
SET NOCOUNT ON
INSERT INTO dbo.Request_changes
(
--ID, // taken care of by IDENTITY(1,1)
--LogDate, // uses default value of GetDate()
ChangeAction,
SQLServerUser,
RequestID,
UserIDContact,
Title,
etc
)
SELECT
'INSERT',
system_user,
-- Request fields
RequestID,
UserIDContact,
etc
FROM
inserted
SET NOCOUNT OFF
GO
您无需访问_changes表(除非您将其映射到另一个XSD数据集),但它非常适合记录和审核以及跟踪错误和历史记录。
其他选项
也许你有一个XSD数据集,它不是由持久存储(如SQL服务器)支持的,而你只是在内存数据集中使用。当属性值发生变化时,还有许多其他设计模式和众所周知的结构可以通知您。
此外,如果您使用的是XSD数据集,是因为您正在处理现有代码库还是遗留应用程序?如果你正在进行新的开发,我会避开它们。这是MS不再积极开发的旧技术。如果你想留在当前版本的Visual Studio附带的MS堆栈中,你最好的赌注是Linq to Sql或Entity Framework,这两个应该更容易处理,并且更灵活(例如,我不喜欢我们认为XSD数据集处理空值非常好,并且它们不支持生成的类中的.NET可空类型。