我正在尝试在 SqlCe 3.5 SP2 中使用一个名为 SqlCeChangeTracking
的新类。此类(据称)允许您在表上打开更改跟踪,而无需使用 RDA 复制或同步服务。
假设您有一个打开的 SqlCeConnection,您可以像这样在表上启用更改跟踪:
SqlCeChangeTracking tracker = new SqlCeChangeTracking(conn);
tracker.EnableTracking(TableName, TrackingKeyType.PrimaryKey,
TrackingOptions.All);
这似乎有效。当我打开 SDF 文件并在 SQL Server Management Studio 中查看它时,该表具有三个附加字段:
__sysChangeTxBsn
、 __sysInsertTxBsn
和 __sysTrackingContext
。根据稀疏文档,这些列(连同 __sysOCSDeletedRows
系统表)用于跟踪更改。问题是这三列总是包含所有行 的 NULL 值,无论我做什么。我可以添加、删除、编辑等,并且这些列无论如何都保持为 NULL(并且在
__sysOCSDeletedRows
中没有出现已删除的记录)。我几乎没有发现关于这个类的任何文档,而且 promise 的 MSDN API 似乎不存在。 有人知道如何成功使用这个类吗?
更新: 我尝试将其更改为使用
TrackingKeyType.Guid
,如下所示:tracker.EnableTracking(TableName, TrackingKeyType.Guid,
TrackingOptions.All);
但这会引发 SqlCeException 29010“该表没有主键。[表名 = EMPLOYEES]”。这很奇怪,因为我正在创建这样的表:
CREATE TABLE EMPLOYEES (BADGE NVARCHAR(5) PRIMARY KEY, NAME NVARCHAR(50),
DEPARTMENT NVARCHAR(10))
这样它确实有一个主键(当我在 SQL Management Studio 中打开 SDF 文件时,我可以看到这个 PK)。
更新 2: 如果我尝试使用其他两个选项(
TrackingKeyType.None
或 TrackingKeyType.Max
)之一启用跟踪,该应用程序会立即死亡并消失得无影无踪,即使该行周围有 try/catch 块。从来都不是好兆头。 最佳答案
我相信启用更改跟踪时存在一个问题,即在调用 EnableTracking 后关闭并重新打开 SqlCeConnection 之前它不会开始工作。这是一些简单的代码,显示了这一点,第一次插入和更新对跟踪列没有任何作用,但是在连接上调用 Close 和 Open 后,将跟踪第二次更新。
using (var cmd = new SqlCeCommand("CREATE TABLE t1 (c1 int primary key, c2 int)", conn))
{
cmd.ExecuteNonQuery();
using (var ceCt = new SqlCeChangeTracking(conn))
{
ceCt.EnableTracking("t1", TrackingKeyType.PrimaryKey, TrackingOptions.All);
}
cmd.CommandText = "insert into t1 (c1, c2) values (1,1)";
cmd.ExecuteNonQuery();
cmd.CommandText = "select __sysChangeTxBsn from t1 where c1 = 1";
var val = cmd.ExecuteScalar();
// This will be null since the connection has not been closed/reopened
Console.WriteLine((val is DBNull) ? "NULL" : val);
cmd.CommandText = "update t1 set c2 = 2 where c1 = 1";
cmd.ExecuteNonQuery();
cmd.CommandText = "select __sysChangeTxBsn from t1 where c1 = 1";
val = cmd.ExecuteScalar();
// This will be null since the connection has not been closed/reopened
Console.WriteLine((val is DBNull) ? "NULL" : val);
// Recycle the connection to get change tracking working
conn.Close();
conn.Open();
cmd.CommandText = "update t1 set c2 = 3 where c1 = 1";
cmd.ExecuteNonQuery();
cmd.CommandText = "select __sysChangeTxBsn from t1 where c1 = 1";
val = cmd.ExecuteScalar();
// This will be non-null and subsequent updates will increase it.
Console.WriteLine((val is DBNull) ? "NULL" : val);
}
关于sql-server-ce - SqlCeChangeTracking 帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2834542/