Помощь с SqlCeChangeTracking - PullRequest
4 голосов
/ 14 мая 2010

Я пытаюсь использовать новый класс в 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 для всех строк , независимо от того, что я делаю. Я могу добавлять, удалять, редактировать и т. Д., И эти столбцы остаются пустыми, несмотря ни на что (и в __sysOCSDeletedRows) никогда не отображаются удаленные записи.

Я практически не нашел документации по этому классу, и обещанный MSDN API, похоже, не существует. Кто-нибудь знает, как успешно использовать этот класс?

Обновление: Я попытался изменить это на использование TrackingKeyType.Guid, например так:

tracker.EnableTracking(TableName, TrackingKeyType.Guid, 
    TrackingOptions.All);

но это выдает SqlCeException 29010 "Таблица не имеет первичного ключа. [Имя таблицы = СОТРУДНИКИ]". Это странно, потому что я создаю таблицу следующим образом:

CREATE TABLE EMPLOYEES (BADGE NVARCHAR(5) PRIMARY KEY, NAME NVARCHAR(50), 
    DEPARTMENT NVARCHAR(10))

, чтобы он имел первичный ключ (и я вижу этот PK при открытии файла SDF в SQL Management Studio).

Обновление 2: Если я попытаюсь включить отслеживание с одним из двух других вариантов (TrackingKeyType.None или TrackingKeyType.Max), приложение мгновенно умирает и исчезает без трассировки, даже с блоком try / catch вокруг линии. Никогда хороший знак.

Ответы [ 2 ]

3 голосов
/ 12 июня 2010

Я полагаю, что при включении отслеживания изменений возникает проблема, которая не работает, пока вы не закроете и не откроете SqlCeConnection повторно после вызова EnableTracking. Вот простой код, который показывает это: первая вставка и обновление ничего не делают со столбцами отслеживания, но после вызова Close и Open для соединения будет отслеживаться 2-е обновление.

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 голос
/ 20 мая 2010

Более подробная документация доступна в онлайновых книгах по SQL Compact 3.5 с пакетом обновления 2 (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.

...