帮助SqlCeChangeTracking

时间:2010-05-14 13:40:50

标签: sql-server-ce

我正在尝试在名为SqlCeChangeTracking的SqlCe 3.5 SP2中使用新类。此类(据称)允许您在不使用RDA复制或同步服务的情况下打开表上的更改跟踪。

假设您有一个打开的SqlCeConnection,您可以在这样的表上启用更改跟踪:

SqlCeChangeTracking tracker = new SqlCeChangeTracking(conn);
tracker.EnableTracking(TableName, TrackingKeyType.PrimaryKey, 
    TrackingOptions.All);

这似乎有用。当我打开SDF文件并在SQL Server Management Studio中查看它时,该表还有三个附加字段:__sysChangeTxBsn__sysInsertTxBsn__sysTrackingContext。根据稀疏文档,这些列(以及__sysOCSDeletedRows系统表)用于跟踪更改。

问题是这三列总是包含所有行的NULL值,无论我做什么。我可以添加,删除,编辑等,无论什么(并且__sysOCSDeletedRows中都没有删除的记录),这些列仍为NULL。

我发现这个类几乎没有任何文档,并且承诺的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.NoneTrackingKeyType.Max),应用会立即死亡并消失,无需跟踪,即使是线上的try / catch块。永远不是一个好兆头。

2 个答案:

答案 0 :(得分:3)

我认为启用更改跟踪时会出现问题,直到您在调用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);
}

答案 1 :(得分:1)

SQL Compact 3.5 SP2在线书籍中提供了更多文档,主题为ms-help://MS.SSC.v35/MS.SSC.v35.EN/sscprog/html/5be071e5-41c9-4775-85d4 -a41d6a370fe7.htm - 从这里下载:http://www.microsoft.com/downloads/details.aspx?familyid=746C3A6E-FFB1-4C92-93FA-B3BA41FDE681&displaylang=en