我正在使用Sql Server Compact并正在构建一个MVC应用程序。
获取数据时,许多表都会链接到很多表,由于每次数据加载时都会获取数据并建立链接,这些表最终会演变成复杂的循环和很长的加载时间。
所以我认为优化是一个好主意,其中一种方法是在加载任何数据之前检查数据是否已更改。如果是,则执行总加载,否则请参考实际存在的数据结构。
有没有办法检查数据库表中的数据是否已更改?也许是一种方法?
谢谢!
答案 0 :(得分:2)
正如Spyro在their answer here中所述:
简单的方法是添加一个类型为TIMESTAMP的可为空的列 触发器:
ON UPDATE CURRENT_TIMESTAMP。
因此,由于列接受,插入不会更改 nulls,您可以通过以下方式选择新列和更改的列:
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);
答案 1 :(得分:0)
你知道,当我构建离线解决方案时,人们可以离线更改数据然后在晚上同步备份,我找到了确定配置数据的最佳方法(很像是什么你要处理的是在每一行都持有timestamp
。这种方法运行得很好的原因是因为我可以构建一个表,根据对每个表的简单MAX查询来索引那些timestamp
值。所以该表可能如下所示:
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