2

我正在使用 Sql Server Compact 并正在构建一个 MVC 应用程序。

在获取我的数据时,许多表都建立了许多链接,最终会演变成复杂的循环和较长的加载时间,因为每次加载数据时都要获取数据并建立链接。

所以我认为优化是一个好主意,一种方法是在加载任何数据之前检查数据是否发生了变化。如果为真,则进行总加载,否则参考实际存在的数据结构。

有没有办法检查我的数据库表中的数据是否发生了变化?一个方法,也许?

谢谢!

4

2 回答 2

2

正如斯派罗在他们的回答中所说:

简单的方法是使用触发器添加一个 TIMESTAMP 类型的可为空列:

ON UPDATE CURRENT_TIMESTAMP。

因此,插入不会更改,因为该列接受空值,您可以通过以下方式仅选择新的和更改的列:

SELECT * FROM `table` WHERE `mdate` > '2011-12-21 12:31:22'

每次更新一行时,此列都会自动更改。

以下是更多信息: http ://dev.mysql.com/doc/refman/5.0/en/timestamp.html

要查看已删除的行,只需创建一个触发器,它将每次删除记录到另一个表:

DELIMITER $$
CREATE TRIGGER MyTable_Trigger
AFTER DELETE ON MyTable
FOR EACH ROW
BEGIN
  INSERT INTO MyTable_Deleted VALUES(OLD.id, NOW());
END$$

或者,您可以对所有表结果执行哈希函数(MD5,SHA1)并将其保存,就像表MD5(table); 的值已MD5(table);更改一样!

// Serialize the table
DataContractSerializer serializer = new DataContractSerializer(typeof(DataTable));
MemoryStream memoryStream = new MemoryStream();
XmlWriter writer = XmlDictionaryWriter.CreateBinaryWriter(memoryStream);
serializer.WriteObject(memoryStream, table);
byte[] serializedData = memoryStream.ToArray();

// Calculte the serialized data's hash value
SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
byte[] hash = SHA.ComputeHash(serializedData);

// Convert the hash to a base 64 string
string hashAsText = Convert.ToBase64String(hash);
于 2013-03-04T19:23:47.910 回答
0

你知道,当我构建一个离线解决方案时,人们可以离线更改数据,然后在晚上同步备份,我找到了确定我们的配置数据的最佳方法(很像你处理)是timestamp在每一行举行。之所以如此有效,是因为我可以构建一个表,该表timestamp基于对每个表的简单 MAX 查询来索引这些值。所以该表可能如下所示:

CREATE TABLE TimestampIndex (
    TableName SYSNAME PRIMARY KEY,
    LastChange TIMESTAMP
)

然后我可以运行基本查询并在它们离线时填充该表:

IF EXISTS (SELECT TableName FROM TimestampIndex WHERE TableName = 'Table1')
    UPDATE TimestampIndex SET LastChange = (SELECT MAX(ts) FROM Table1)
ELSE
    INSERT INTO TimestampIndex (TableName, LastChange) SELECT 'Table1', MAX(ts) FROM Table1

然后当他们重新上线时,我可以简单地执行以下操作:

IF NOT EXISTS (SELECT TableName FROM TimestampIndex WHERE TableName = 'Table1' AND LastChange = (SELECT MAX(ts) FROM RemoteDb.dbo.Table1))
BEGIN
    -- there must be changes to make then
END
于 2013-03-04T19:27:55.557 回答