static void TrackDataChanges() { //Change tracking allow users to track data changes in user defined tables. // Tracking is done for all schema's and all user tables for INSERT, UPDATE and DELETE queries using (SqlDatabaseConnection cnn = new SqlDatabaseConnection()) { cnn.ConnectionString = "SchemaName=db;uri=file://" + ExampleDatabaseFile + ";"; //Enable Tracking cnn.TrackDataChanges = true; //Set buffer size, default is to track last 1000 changes. // for this example we will change it to 10 cnn.TrackedChangesMaxCount = 10; cnn.Open(); using (SqlDatabaseCommand cmd = new SqlDatabaseCommand()) { cmd.Connection = cnn; cmd.CommandText = "CREATE TABLE IF NOT EXISTS UsersTestTable (Username TEXT PRIMARY KEY, FirstName TEXT, LastName TEXT);"; cmd.ExecuteNonQuery(); // INSERT cmd.CommandText = "INSERT INTO UsersTestTable VALUES ('johndoe', 'John' , 'DOE');"; cmd.CommandText += "INSERT INTO UsersTestTable VALUES ('janedoe', 'Jane' , 'DOE');"; cmd.ExecuteNonQuery(); // UPDATE cmd.CommandText = "UPDATE UsersTestTable SET LastName = 'Doe' WHERE Username = '******'; "; cmd.ExecuteNonQuery(); // DELETE - The actual row is not recoverable after the delete // Only RowId is stored without deleted data. cmd.CommandText = "DELETE FROM UsersTestTable WHERE Username = '******'; "; cmd.ExecuteNonQuery(); // INSERT again to show new RowId has been generated cmd.CommandText = "INSERT INTO UsersTestTable VALUES ('johndoe', 'John' , 'DOE');"; cmd.ExecuteNonQuery(); // To view changes we will call GetTrackedDataChanges() function which will yeild foreach (SqlDatabaseDataChanges tdc in cnn.GetTrackedDataChanges()) { string DMLType = string.Empty; switch (tdc.ChangeType) { case 1: DMLType = "INSERT"; break; case 2: DMLType = "UPDATE"; break; case 3: DMLType = "DELETE"; break; default: DMLType = "UNKNOWN"; break; } Console.WriteLine("ChangeType {0} \t SchemaName: {1} \t TableName: {2} \t RowId: {3} \t DateTime: {4}" , DMLType , tdc.SchemaName , tdc.TableName , tdc.RowId , new DateTime(tdc.NowTicks)); } // To view changed row simply query using SELECT with where clause // By default each row is given unique RowId // Using Linq with changeType = 2 for updated rows only. Int64 RowId = cnn.GetTrackedDataChanges().Where(item => item.ChangeType == 2).FirstOrDefault().RowId; cnn.MultipleActiveResultSets = true; cmd.CommandText = "SELECT * FROM UsersTestTable WHERE RowId = " + RowId; SQLDatabaseResultSet[] rs = cmd.ExecuteReader(false); if (rs != null) { if (!string.IsNullOrWhiteSpace(rs[0].ErrorMessage)) { Console.WriteLine(rs[0].ErrorMessage); return; } foreach (object[] row in rs[0].Rows) { foreach (object column in row) { Console.WriteLine(column); } } } } } }