<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Microsoft Sync Framework同步數(shù)據(jù)庫 3:針對同步進行設(shè)置

      針對同步進行設(shè)置

      在可以使用 Sync Framework 同步數(shù)據(jù)庫之前,需要通過稱為“設(shè)置(provisioning)”的流程配置它。所需的設(shè)置類型因數(shù)據(jù)庫類型而異。本篇提供有關(guān)設(shè)置 SQL Server 和 SQL Server Compact 數(shù)據(jù)庫的背景信息、操作步驟以及完整代碼示例。

      了解設(shè)置和取消設(shè)置(Provision and Deprovision)

      為同步配置數(shù)據(jù)庫的第一步是定義一個作用域,該作用域標(biāo)識要同步的內(nèi)容。在您定義同步作用域后,就可以使用該同步作用域來設(shè)置數(shù)據(jù)庫,以便創(chuàng)建變更跟蹤和元數(shù)據(jù)管理基礎(chǔ)結(jié)構(gòu),該基礎(chǔ)結(jié)構(gòu)由元數(shù)據(jù)表、觸發(fā)器和存儲過程構(gòu)成。在設(shè)置了某一數(shù)據(jù)庫后,可以通過使用某一提供程序(例如 SqlSyncProvider)來表示該數(shù)據(jù)庫和使用 SyncOrchestrator 對象管理同步會話并連接到其他同步提供程序以實現(xiàn)數(shù)據(jù)同步。為同步設(shè)置數(shù)據(jù)庫是有別于與其他數(shù)據(jù)庫同步的單獨任務(wù),這部分代碼通常位于單獨的應(yīng)用程序中。

      設(shè)置(Provision)

      在設(shè)置(Provision)數(shù)據(jù)庫時,通常會在數(shù)據(jù)庫中創(chuàng)建以下某些或全部元素:

      • 在同步作用域中包含的基表。
      • 作用域中每個基表的一個跟蹤表。該跟蹤表跟蹤對關(guān)聯(lián)基表進行的變更。
      • 在直接對基表進行更改時更新跟蹤表的觸發(fā)器。
      • 用于同步操作的存儲過程,例如枚舉變更、插入變更、更新數(shù)據(jù)或刪除數(shù)據(jù)。通過設(shè)置對象的SetUseBulkProceduresDefault方法可以為SQL Server 2008 和 SQL Azure 數(shù)據(jù)庫創(chuàng)建使用表值函數(shù)一次執(zhí)行多行的插入、更新和刪除操作的成批過程。
      • 包含同步作用域信息的特殊表,例如 scope_info 表。如果這些表尚不存在,則創(chuàng)建這些表。

      數(shù)據(jù)庫設(shè)置對象提供了相應(yīng)方法來控制上面這些同步元素的創(chuàng)建,比如:基表創(chuàng)建由 SetCreateTableDefault 方法控制,跟蹤表創(chuàng)建由 SetCreateTrackingTableDefault 方法控制。此外,同步元素可以創(chuàng)建在數(shù)據(jù)庫的單獨架構(gòu)(Schema)中,這是通過 SqlSyncScopeProvisioning類的ObjectSchema 屬性實現(xiàn)的。

      可通過調(diào)用 SqlSyncScopeProvisioning.Apply 或 SqlCeSyncScopeProvisioning.Apply方法直接應(yīng)用設(shè)置;或者,對于 SQL Server 數(shù)據(jù)庫,可以創(chuàng)建一個腳本并在以后運行該腳本來設(shè)置數(shù)據(jù)庫。若要創(chuàng)建設(shè)置腳本,請調(diào)用 SqlSyncScopeProvisioning.Script 方法。

      取消設(shè)置(Deprovision)

      如果您不再需要某一作用域,則可以通過調(diào)用SqlSyncScopeDeprovisioning.DeprovisionScope 或 SqlCeSyncScopeDeprovisioning.DeprovisionScope,刪除該作用域及其關(guān)聯(lián)的元數(shù)據(jù)表、觸發(fā)器和存儲過程。在已刪除某一作用域后,該作用域不再用于同步。如果某一數(shù)據(jù)庫元素(例如元數(shù)據(jù)表)由多個作用域使用,則在使用該元素的最后一個作用域被刪除前,將不刪除該元素。例如,您具有名為 Customers 的一個表,并且定義兩個分別名為 RetailCustomers 和 WholesaleCustomers 的作用域,并且這兩個作用域包含 Customers 表。在您刪除 WholesaleCustomers 作用域時,用于 Customers 表的元數(shù)據(jù)表不刪除,因為它仍由 RetailCustomers 作用域使用。

      如果您使用基于參數(shù)的篩選器來篩選 SQL Server 或 SQL Azure 數(shù)據(jù)庫中的同步數(shù)據(jù),則首先創(chuàng)建一個篩選器模板,然后基于該篩選器模板創(chuàng)建篩選的作用域。您還可以通過調(diào)用 DeprovisionTemplate,輕松地刪除該篩選器模板和基于該模板創(chuàng)建的所有經(jīng)過篩選的作用域,以及所有關(guān)聯(lián)的元數(shù)據(jù)表、觸發(fā)器和存儲過程。例如,您創(chuàng)建一個 customerstate_template 模板,該模板通過使用 state 參數(shù)進行篩選。您基于 customerstate_template 創(chuàng)建兩個經(jīng)過篩選的作用域 customers_WA 和 customers_OR。在您刪除 customerstate_template 時,customers_WA 和 customers_OR 也刪除。

      您還可以通過調(diào)用SqlSyncScopeDeprovisioning.DeprovisionStore 或 SqlCeSyncScopeDeprovisioning.DeprovisionStore,從數(shù)據(jù)庫中刪除所有作用域和篩選器以及所有同步元數(shù)據(jù)表、觸發(fā)器和存儲過程。此外,因為刪除單獨的作用域和篩選器模板將僅刪除作用域級別和模板級別的元數(shù)據(jù),而不刪除數(shù)據(jù)庫級別的元數(shù)據(jù),所以,SqlSyncScopeDeprovisioning.DeprovisionStore 或 SqlCeSyncScopeDeprovisioning.DeprovisionStore 可用于在刪除了所有作用域和模板后清除剩余的同步元數(shù)據(jù)表。

       

      設(shè)置數(shù)據(jù)庫

      同步作用域和同步模板

      我們之前已經(jīng)了解到,同步作用域是對進行同步的對象的一種邏輯分組。對于數(shù)據(jù)庫同步,一個同步組通常是一組數(shù)據(jù)表,并且數(shù)據(jù)表可以被過濾。同時一個數(shù)據(jù)表可以被包含在一個或多個同步組中。

      有些時候,我們需要使用基于參數(shù)的篩選器來篩選 SQL Server 或 SQL Azure 數(shù)據(jù)庫中的同步數(shù)據(jù),則首先創(chuàng)建一個篩選器模板,然后基于該篩選器模板創(chuàng)建篩選的作用域。比如,每個銷售人員只對自己相關(guān)的訂單數(shù)據(jù)感興趣,那么我們就需要針對每個銷售人員創(chuàng)建同步作用域,這時,我們就可以使用同步模板來簡化同步作用域的創(chuàng)建過程,甚至通過訂閱的手段來實現(xiàn)這一過程的自動化。關(guān)于篩選器模板的詳細介紹請參考下篇“如何為數(shù)據(jù)庫同步篩選數(shù)據(jù)”。

      定義同步作用域

      下面的代碼定義了一個名為filtered_customer 的同步作用域,并為其添加了兩個表:Customer和CustomerContact。因為這些表已經(jīng)存在于服務(wù)器數(shù)據(jù)庫之中,所以使用GetDescriptionForTable方法來檢索表的架構(gòu)。Customer表的所有列都包含在同步作用域中,但是CustomerContact表只包含了兩列。

                  DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("filtered_customer");

      // Definition for Customer.
      DbSyncTableDescription customerDescription =
      SqlSyncDescriptionBuilder.GetDescriptionForTable("Sales.Customer", serverConn);

      scopeDesc.Tables.Add(customerDescription);

      // Definition for CustomerContact, including the list of columns to include.
      Collection<string> columnsToInclude = new Collection<string>();
      columnsToInclude.Add("CustomerId");
      columnsToInclude.Add("PhoneType");
      DbSyncTableDescription customerContactDescription =
      SqlSyncDescriptionBuilder.GetDescriptionForTable("Sales.CustomerContact", columnsToInclude, serverConn);

      scopeDesc.Tables.Add(customerContactDescription);

      設(shè)置服務(wù)器數(shù)據(jù)庫

      下面的代碼為filtered_customer 同步作用域創(chuàng)建了一個設(shè)置對象,并且指定所有同步元素創(chuàng)建在"Sync"數(shù)據(jù)庫架構(gòu)中。代碼還為Customer表指定了一個過濾條件,只有滿足該條件的數(shù)據(jù)行才會被同步。定義一個過濾條件分為兩部分:調(diào)用AddFilterColumn指定過濾列名為”CustomerType”,它會被添加到變更跟蹤表以跟蹤Customer表的改變。調(diào)用FilterClause指定過濾條件本身,它是不包含WHERE關(guān)鍵字的WHERE子句。[side]是變更跟蹤表的別名。定義好設(shè)置選項后,Apply方法會在服務(wù)器數(shù)據(jù)庫中創(chuàng)建變更跟蹤基礎(chǔ)結(jié)構(gòu),并且把設(shè)置腳本寫到一個文件中。

                  SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning(serverConn, scopeDesc);
      serverConfig.ObjectSchema = "Sync";

      // Specify which column(s) in the Customer table to use for filtering data,
      // and the filtering clause to use against the tracking table.
      // "[side]" is an alias for the tracking table.
      serverConfig.Tables["Sales.Customer"].AddFilterColumn("CustomerType");
      serverConfig.Tables["Sales.Customer"].FilterClause = "[side].[CustomerType] = 'Retail'";

      // Configure the scope and change-tracking infrastructure.
      serverConfig.Apply();

      // Write the configuration script to a file. You can modify
      // this script if necessary and run it against the server
      // to customize behavior.
      File.WriteAllText("SampleConfigScript.txt", serverConfig.Script());

      設(shè)置客戶端數(shù)據(jù)庫

      我們可以通過兩種方式來設(shè)置客戶端數(shù)據(jù)庫:

      1. 基于從服務(wù)器或另外的客戶端數(shù)據(jù)庫獲取的scope/作用域信息,完全初始化一個SQL Server或SQL Server Compact客戶端數(shù)據(jù)庫。我們可以通過SqlSyncDescriptionBuilder和SqlCeSyncDescriptionBuilder對象來獲取同步作用域的架構(gòu)信息,從而在客戶端數(shù)據(jù)庫創(chuàng)建同步對象。

      2. 通過一個已經(jīng)存在的客戶端數(shù)據(jù)庫來對一個SQL Server Compact客戶端數(shù)據(jù)庫進行快照初始化。

      快照初始化的主要目的是減少初始化客戶端數(shù)據(jù)庫所需的時間。更多關(guān)于快照初始化的知識請參照本篇“使用快照設(shè)置數(shù)據(jù)庫”的詳細介紹。

      下面的代碼示例首先從服務(wù)器獲取同步作用域信息,并使用它們來設(shè)置一個SQL Server Compact客戶端數(shù)據(jù)庫。然后,基于該SQL Server Compact客戶端數(shù)據(jù)庫的作用域信息來設(shè)置另一個SQL Server客戶端數(shù)據(jù)庫。

                  // 創(chuàng)建一個SQL Server Compact數(shù)據(jù)庫并用從服務(wù)器端獲取的作用域信息來設(shè)置它
      // Compact數(shù)據(jù)庫不支持單獨的schema,
      // 所以我們通過為所有的同步對象增加前綴"Sync"來使他們易于區(qū)分
      Utility.DeleteAndRecreateCompactDatabase(Utility.ConnStr_SqlCeSync1, true);
      Utility.DeleteAndRecreateCompactDatabase(Utility.ConnStr_SqlCeSync2, false);
      DbSyncScopeDescription clientSqlCe1Desc = SqlSyncDescriptionBuilder.GetDescriptionForScope("filtered_customer", null, "Sync", serverConn);
      SqlCeSyncScopeProvisioning clientSqlCe1Config = new SqlCeSyncScopeProvisioning(clientSqlCe1Conn, clientSqlCe1Desc);
      clientSqlCe1Config.ObjectPrefix = "Sync";
      clientSqlCe1Config.Apply();

      // 通過從SQL Server Compact數(shù)據(jù)庫中獲取的同步作用域信息來設(shè)置一個SQL Server客戶端數(shù)據(jù)庫
      // 當(dāng)然我們也可以從服務(wù)器端獲取作用域信息
      DbSyncScopeDescription clientSqlDesc = SqlCeSyncDescriptionBuilder.GetDescriptionForScope("filtered_customer", "Sync", clientSqlCe1Conn);
      SqlSyncScopeProvisioning clientSqlConfig = new SqlSyncScopeProvisioning(clientSqlConn, clientSqlDesc);
      clientSqlConfig.ObjectSchema = "Sync";
      clientSqlConfig.Apply();

       

      取消設(shè)置數(shù)據(jù)庫

      下面的代碼示例為我們展示了如何:

      • 在客戶端數(shù)據(jù)庫中取消設(shè)置一個同步作用域
      • 在服務(wù)器數(shù)據(jù)庫中取消設(shè)置篩選器模板和相關(guān)的作用域
      • 完全取消設(shè)置一個客戶端數(shù)據(jù)庫,這樣所有的同步對象都會被刪除

      刪除一個作用域

      下面的示例在一個SQL Server客戶端數(shù)據(jù)庫中刪除RetailCustomers作用域。同時,刪除作用域的腳本被保存到了一個文件之中,這個腳本可以用來執(zhí)行以刪除其他數(shù)據(jù)庫中的RetailCustomers作用域。淡然,這個步驟對于刪除一個同步作用域來說是可選的。

                  // 在SQL Server客戶端數(shù)據(jù)庫中刪除RetailCustomers作用域
      SqlSyncScopeDeprovisioning clientSqlDepro = new SqlSyncScopeDeprovisioning(clientSqlConn);

      // 首先把取消設(shè)置的SQL腳本保存下來,以便取消設(shè)置其他的SQL Server客戶端數(shù)據(jù)庫
      // 這一步是可選的
      File.WriteAllText("SampleDeprovisionScript.txt",
      clientSqlDepro.ScriptDeprovisionScope("RetailCustomers"));

      // 刪除作用域
      clientSqlDepro.DeprovisionScope("RetailCustomers");

      刪除一個篩選器模板

      在刪除一個篩選器模板之前,我們通常需要查看從這個篩選器模板創(chuàng)建出來的同步作用域,因為當(dāng)這個篩選器模板被刪除(Deprovision)時,所有這些作用域也會被刪除。下面的SQL腳本可以用來查找由customertype_template篩選器模板所創(chuàng)建的篩選作用域。

      -- Find all filtered scopes that were created from the filtered scope template named 'customertype_template'.

      select sync_scope_name from scope_info
      where scope_config_id =
      (select template_config_id from scope_templates
      where template_name = N'customertype_template')

      下面的示例從SQL Server服務(wù)器數(shù)據(jù)庫中刪除customertype_template篩選器模板。在刪除該模板的同時也會刪除由它創(chuàng)建出來的作用域RetailCustomers和WholesaleCustomers。

                  // 從服務(wù)器數(shù)據(jù)庫中刪除"customertype_template"模板
      // 這樣也會刪除所有依賴與該模板的作用域
      SqlSyncScopeDeprovisioning serverSqlDepro = new SqlSyncScopeDeprovisioning(serverConn);
      serverSqlDepro.DeprovisionTemplate("customertype_template");

      刪除所有同步對象

      下面的示例從一個SQL Server Compact客戶端數(shù)據(jù)庫中刪除所有的同步對象,包括:同步元數(shù)據(jù)表、觸發(fā)器和存儲過程。

                  // 在SQL Server Compact數(shù)據(jù)庫這哦你刪除所有的同步對象
      SqlCeSyncScopeDeprovisioning clientSqlCeDepro = new SqlCeSyncScopeDeprovisioning(clientSqlCe1Conn);
      clientSqlCeDepro.DeprovisionStore();

       

      使用快照設(shè)置數(shù)據(jù)庫

      如果我們需要對多個SQL Server Compact數(shù)據(jù)庫的同步進行設(shè)置,那么我們可以使用數(shù)據(jù)庫快照來減少初始化所需的時間。一個快照是特別準(zhǔn)備的,包含了表架構(gòu)、數(shù)據(jù)(可選)、和變更跟蹤基礎(chǔ)結(jié)構(gòu)的SQL Server Compact數(shù)據(jù)庫。在我們對一個SQL Server Compact數(shù)據(jù)庫作完全初始化后,我們可以為其創(chuàng)建一個快照,該快照可以拷貝至其他需要同步的SQL Server Compact數(shù)據(jù)庫。對數(shù)據(jù)庫應(yīng)用快照的過程比完全初始化要高效得多。

      下面的示例為我們展示了通過從服務(wù)器數(shù)據(jù)庫獲取的作用域信息來設(shè)置Compact數(shù)據(jù)庫,然后使用該數(shù)據(jù)庫的快照來初始化另外一個數(shù)據(jù)庫。

              static void SynchronizationUsingSnapshot()
      {
      // 通過從服務(wù)器數(shù)據(jù)庫獲取的作用域信息來設(shè)置Compact數(shù)據(jù)庫SyncCompactDB2.sdf
      SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='D:\Sync Framework\CompactDB\SyncCompactDB2.sdf'");
      SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
      DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope("ProductsScope", serverConn);
      SqlCeSyncScopeProvisioning clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);
      clientProvision.Apply();

      // 從SQL Server Compact數(shù)據(jù)庫創(chuàng)建一個快照,該快照將用于初始化其他的Compact數(shù)據(jù)庫
      // 盡管我們可以從其他數(shù)據(jù)庫獲取作用域信息來初始化,但快照的使用為Compact數(shù)據(jù)庫提供了一個更加快捷方便的部署方案。
      // SyncCompactDB3.sdf為不存在的Compact數(shù)據(jù)庫,將在GenerateSnapshot方法中自動創(chuàng)建
      string newCompactDB = @"D:\Sync Framework\CompactDB\SyncCompactDB3.sdf";
      SqlCeSyncStoreSnapshotInitialization syncStoreSnapshot = new SqlCeSyncStoreSnapshotInitialization();
      syncStoreSnapshot.GenerateSnapshot(clientConn, newCompactDB);

      // 對使用快照初始化的SyncCompactDB3.sdf執(zhí)行同步,因為快照中已經(jīng)包含了服務(wù)器中的數(shù)據(jù)
      // 所以本次同步將沒有數(shù)據(jù)被同步,直到一方的數(shù)據(jù)發(fā)生變化
      SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
      syncOrchestrator.LocalProvider = new SqlCeSyncProvider("ProductsScope", clientConn);
      syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);
      syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
      SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
      DisplayStats(syncStats);
      }

      static void DisplayStats(SyncOperationStatistics syncStats)
      {
      // 輸出統(tǒng)計數(shù)據(jù)
      Console.WriteLine("Start Time: " + syncStats.SyncStartTime);
      Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal);
      Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal);
      Console.WriteLine("Complete Time: " + syncStats.SyncEndTime);
      Console.WriteLine(String.Empty);
      }

       

      posted @ 2012-03-12 16:03  Life a Poem  閱讀(4247)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 蜜芽久久人人超碰爱香蕉| 亚洲国产精品成人av网| 少妇人妻综合久久中文字幕| 人妻无码ΑV中文字幕久久琪琪布| 精品自拍偷拍一区二区三区| 欧美人与动牲交A免费观看| 人妻av中文字幕无码专区| 吐鲁番市| 国产精品一区 在线播放| 人妻丝袜AV中文系列先锋影音 | 最新亚洲av日韩av二区| 国产精品三级中文字幕| 国产免费网站看v片元遮挡| 99久久无色码中文字幕| 亚洲日韩一区二区| av日韩在线一区二区三区| 1精品啪国产在线观看免费牛牛| 免费人妻无码不卡中文字幕18禁| 国产亚洲精品中文字幕| 天堂国产一区二区三区四区不卡| 亚洲第一最快av网站| 国产成人最新三级在线视频| 国产成人午夜精品福利| 日韩中文字幕高清有码| 国产中年熟女大集合| 精选国产av精选一区二区三区| 国产成人精品永久免费视频| 久久久久久久一线毛片| 中文 在线 日韩 亚洲 欧美| 在线免费播放亚洲自拍网| 国产v综合v亚洲欧美大天堂| 色哟哟www网站入口成人学校| 精品人妻中文字幕av| 成av免费大片黄在线观看| 激情久久综合精品久久人妻| 色综合久久网| 久久96热在精品国产高清| 成人精品自拍视频免费看| 日本精品极品视频在线| 日韩av裸体在线播放| 国产一区二区三区av在线无码观看 |