你可以重新下載一個(gè)System.Data.SqlServerCe.dll文件,復(fù)制到c:\windows\system32文件夾【64位系統(tǒng)在C:\Windows\SysWOW64目錄】,然后“開始,運(yùn)行,輸入regsvr32 System.Data.SqlServerCe.dll”即可。
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)榕城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
小技巧:如果無法進(jìn)入桌面,可以啟動(dòng)安全模式或者使用PE啟動(dòng)電腦,然后修復(fù)。
如果服務(wù)器正在運(yùn)行 SQL Server 2008,則建議您使用 SQL Server 變更跟蹤。如果服務(wù)器運(yùn)行的是其他數(shù)據(jù)庫,請參見如何使用自定義變更跟蹤系統(tǒng)。SQL Server 變更跟蹤概述本文檔中的許多示例都使用一組添加到基表中的列和觸發(fā)器來處理變更跟蹤,使用其他表來跟蹤刪除操作。有關(guān)更多信息,請參見跟蹤服務(wù)器數(shù)據(jù)庫中的變更。這種類型的跟蹤對于非 SQL Server 2008 數(shù)據(jù)庫非常有用。但是,它還是具有以下缺點(diǎn):在服務(wù)器數(shù)據(jù)庫中要求架構(gòu)變更。架構(gòu)變更可能會(huì)影響其他應(yīng)用程序,或者可能根本無法實(shí)現(xiàn)。對一行中執(zhí)行的每個(gè)變更都會(huì)激發(fā)觸發(fā)器。這會(huì)影響性能。用于維護(hù)正確的行版本和刪除的邏輯將變得復(fù)雜。如果某一服務(wù)器數(shù)據(jù)庫具有長時(shí)間運(yùn)行的事務(wù),則除非這些事務(wù)得到正確處理,否則,在同步期間可能會(huì)失去數(shù)據(jù)變更。這可能導(dǎo)致數(shù)據(jù)不一致。 SQL Server 變更跟蹤可解決這些問題,并提供一種簡明的方法來跟蹤變更。當(dāng)對某一表啟用了變更跟蹤時(shí),SQL Server 數(shù)據(jù)庫引擎 將維護(hù)有關(guān)對表所做變更的信息。然后,應(yīng)用程序使用相應(yīng)變更跟蹤函數(shù)來確定哪些行發(fā)生了變更并獲取有關(guān)這些變更的信息。SQL Server 變更跟蹤的主要優(yōu)點(diǎn)如下:對于使用 Sync Services 的脫機(jī)同步方案,您不必創(chuàng)建觸發(fā)器、時(shí)間戳列、其他附加列或附加表。在提交時(shí)跟蹤變更,而不是在發(fā)生 DML 操作時(shí)跟蹤。函數(shù)將返回對表所做的增量變更和版本信息。即使存在重疊和未提交的事務(wù),這些函數(shù)也能提供可靠且易于使用的結(jié)果。對性能的影響非常小??梢宰詣?dòng)清除變更跟蹤數(shù)據(jù)。本主題的其余部分將演示如何在 Sync Services for ADO.NET 應(yīng)用程序中使用 SQL Server 變更跟蹤。有關(guān)變更跟蹤的更多信息,請參見 SQL Server 2008 聯(lián)機(jī)叢書。將SQL Server 變更跟蹤與 Sync Services for ADO.NET 一起使用本節(jié)介紹如何啟用變更跟蹤,以及如何使用變更跟蹤查詢來確定要下載到客戶端的數(shù)據(jù)變更。本節(jié)中的信息介紹如何使用手動(dòng)創(chuàng)建的命令選擇來自服務(wù)器的變更。有關(guān)如何使用同步適配器生成器為您創(chuàng)建命令的信息,請參見入門:客戶端與服務(wù)器同步。啟用SQL Server 變更跟蹤對服務(wù)器數(shù)據(jù)庫啟用變更跟蹤,然后對每個(gè)需要跟蹤的表啟用變更跟蹤。下面的代碼示例演示一個(gè) Sync Services 示例數(shù)據(jù)庫中的 Sales.Customer 表的架構(gòu)以及為該表啟用變更跟蹤所需的代碼。每個(gè)表都必須有一個(gè)主鍵。主鍵在所有節(jié)點(diǎn)上必須是唯一的,而且不得重復(fù)使用:即使刪除了某一行,也不得將該行的主鍵用于其他行。對于分布式環(huán)境,標(biāo)識列通常不是適宜的選擇。有關(guān)主鍵的更多信息,請參見為分布式環(huán)境選擇適宜的主鍵 (Sync Services)。通過運(yùn)行以下代碼指定的變更跟蹤選項(xiàng)包括保留跟蹤元數(shù)據(jù)的時(shí)間以及是否自動(dòng)清除這些元數(shù)據(jù)。有關(guān)跟蹤選項(xiàng)的更多信息,請參見 SQL Server 2008 聯(lián)機(jī)叢書中的“變更跟蹤”、“ALTER DATABASE”和“ALTER TABLE”主題。 CREATE TABLE SyncSamplesDb_ChangeTracking.Sales.Customer( CustomerId uniqueidentifier NOT NULL PRIMARY KEY DEFAULT NEWID(), CustomerName nvarchar(100) NOT NULL, SalesPerson nvarchar(100) NOT NULL, CustomerType nvarchar(100) NOT NULL) ALTER DATABASE SyncSamplesDb_ChangeTracking SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE SyncSamplesDb_ChangeTracking SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) ALTER TABLE SyncSamplesDb_ChangeTracking.Sales.Customer ENABLE CHANGE_TRACKING 注意強(qiáng)烈建議您在查詢變更信息時(shí)使用快照事務(wù)。這有助于確保變更信息的一致性并避免出現(xiàn)與后臺清除任務(wù)相關(guān)的爭用情況。有關(guān)快照隔離的更多信息,請參見 SQL Server 2008 聯(lián)機(jī)叢書中的“數(shù)據(jù)庫引擎中的隔離級別”。確定要下載到客戶端的數(shù)據(jù)變更啟用變更跟蹤后,Sync Services 應(yīng)用程序使用變更跟蹤函數(shù)和“定位點(diǎn)”來確定要下載的插入、更新和刪除。定位點(diǎn)僅僅是用來定義一組要同步的變更的一個(gè)時(shí)間點(diǎn)。請考慮以下查詢:為SelectIncrementalInsertsCommand 屬性指定的查詢。以下查詢從服務(wù)器上的 Sales.Customer 表選擇要應(yīng)用于客戶端的增量插入: IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION = @sync_new_received_anchor) END 如果這是某個(gè)客戶端的第一個(gè)同步會(huì)話 (@sync_initialized = 0),則會(huì)從 Sales.Customer 基表直接選擇架構(gòu)和所有行。在以后的同步期間,通過執(zhí)行基表與其變更跟蹤表的內(nèi)部聯(lián)接來選擇新插入的行。變更跟蹤表中的元數(shù)據(jù)由 CHANGETABLE() 函數(shù)公開。該函數(shù)將基表名稱和前一同步操作所存儲的變更跟蹤版本作為參數(shù)。SYS_CHANGE_OPERATION 列定義存儲在變更跟蹤表行中的變更的類型。注意查詢還應(yīng)檢查所需的所有變更是否都已從跟蹤表中清除。有關(guān)示例,請參見本主題后面的“指定一條從服務(wù)器上選擇要應(yīng)用于客戶端的增量插入的命令”。為SelectNewAnchorCommand 屬性指定的查詢。此查詢檢索一個(gè)時(shí)間點(diǎn)值。以下查詢通過使用 change_tracking_current_version() 函數(shù)從服務(wù)器中檢索新的定位點(diǎn)值。這一內(nèi)置的 SQL Server 函數(shù)返回一個(gè)版本整數(shù),它與通過變更跟蹤進(jìn)行跟蹤的上次提交的事務(wù)相關(guān)聯(lián)。 SELECT @sync_new_received_anchor = change_tracking_current_version() 該整數(shù)值存儲在客戶端數(shù)據(jù)庫中,并且由同步變更的命令使用。在每次同步會(huì)話期間,將使用新的定位點(diǎn)值以及來自先前同步會(huì)話的上一個(gè)定位點(diǎn)值:這意味著將對在這兩個(gè)作為上下限的定位點(diǎn)值之間做出的變更集進(jìn)行同步。在某些情況下,應(yīng)用程序只要求每個(gè)客戶端上的一部分?jǐn)?shù)據(jù)。可以在 WHERE 子句中包括附加的條件,以便篩選數(shù)據(jù)。有關(guān)更多信息,請參見如何篩選行和列?!盎诜擎I列的篩選器”一節(jié)中包括與使用 SQL Server 變更跟蹤進(jìn)行篩選有關(guān)的重要信息。在同步過程中執(zhí)行的查詢?nèi)绻鞘状瓮?Sales.Customer 表,則會(huì)執(zhí)行以下過程:執(zhí)行新的定位點(diǎn)命令。該命令返回一個(gè)整數(shù)值,如 372。此值存儲在客戶端數(shù)據(jù)庫中。該表從未進(jìn)行過同步。因此,客戶端數(shù)據(jù)庫中原本沒有存儲任何從先前同步操作所得到的定位點(diǎn)值。在這種情況下,Sync Services 使用值 0。Sync Services 執(zhí)行的查詢?nèi)缦滤荆?exec sp_executesql N'IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = ''I'' AND CT.SYS_CHANGE_CREATION_VERSION = @sync_new_received_anchor) END', N'@sync_initialized int, @sync_last_received_anchor bigint, @sync_new_received_anchor bigint', @sync_initialized=0, @sync_last_received_anchor=0, @sync_new_received_anchor=372 在第二次同步會(huì)話期間,執(zhí)行新的定位點(diǎn)命令。自上一會(huì)話以來已經(jīng)插入了一些行。因此,該命令返回值 375。該表以前已進(jìn)行過同步。因此,Sync Services 可檢索先前同步操作所得到的客戶端數(shù)據(jù)庫中存儲的 372 的定位點(diǎn)值。執(zhí)行的查詢?nèi)缦滤?。該查詢只從表中下載在兩個(gè)定位點(diǎn)值之間插入的行。 exec sp_executesql N'IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = ''I'' AND CT.SYS_CHANGE_CREATION_VERSION = @sync_new_received_anchor) END', N'@sync_initialized int, @sync_last_received_anchor bigint, @sync_new_received_anchor bigint', @sync_initialized=1, @sync_last_received_anchor=372, @sync_new_received_anchor=375 有關(guān)更新和刪除命令的示例,請參見本主題后面的完整代碼示例。標(biāo)識執(zhí)行數(shù)據(jù)變更的客戶端之所以要標(biāo)識執(zhí)行數(shù)據(jù)變更的客戶端,主要有兩個(gè)原因:在僅進(jìn)行上載的同步和雙向同步中為沖突檢測和沖突解決提供支持。如果服務(wù)器和某個(gè)客戶端(或多個(gè)客戶端)可以變更某個(gè)給定行,您可能希望標(biāo)識出變更的執(zhí)行者。此信息有助于您編寫代碼,例如,編寫確定哪一個(gè)變更具有更高的優(yōu)先級的代碼。如果沒有此信息,將保留對該行的最近一次變更。在雙向同步期間,防止將變更回送給客戶端。 Sync Services 首先將變更上載到服務(wù)器,然后將變更下載到客戶端。如果不跟蹤執(zhí)行變更的客戶端的標(biāo)識,該變更將上載到服務(wù)器,然后在同一個(gè)同步會(huì)話中下載回到該客戶端。某些情況下,回送變更是必需的,但是在另一些情況下并非如此。變更跟蹤提供一個(gè)機(jī)制,可以將應(yīng)用程序數(shù)據(jù)與變更行時(shí)的變更信息一起存儲。這些應(yīng)用程序數(shù)據(jù)可用于標(biāo)識正在進(jìn)行變更的客戶端。然后,在您查詢變更時(shí)可返回進(jìn)行了變更的客戶端的這一標(biāo)識。SYS_CHANGE_CONTEXT 列可與 ClientId 屬性一起使用,以確定每個(gè)插入、更新或刪除操作是由哪個(gè)客戶端執(zhí)行的。在任何表使用除快照同步以外的方法進(jìn)行第一次同步時(shí),Sync Services 會(huì)在客戶端上存儲一個(gè) GUID 值以標(biāo)識該客戶端。然后將此 ID 傳遞給 DbServerSyncProvider,以便能夠由每個(gè) SyncAdapter 對象的命令使用??梢酝ㄟ^ ClientId 屬性以及 @sync_client_id 和@sync_client_id_binary 會(huì)話變量獲得該 ID 值。請考慮以下 Transact-SQL 查詢: IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT @sync_client_id_binary) ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION = @sync_new_received_anchor AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT @sync_client_id_binary)); 此查詢類似于前面用來跟蹤在服務(wù)器上所做插入操作的查詢。每個(gè) WHERE 子句中的附加語句可確保只下載那些不是由當(dāng)前進(jìn)行同步的客戶端所做的插入。Sync Services 還允許應(yīng)用程序通過在服務(wù)器上使用一個(gè)整數(shù)而不是 GUID 值來標(biāo)識客戶端。有關(guān)更多信息,請參見如何使用會(huì)話變量。若要跟蹤哪一客戶端進(jìn)行了在服務(wù)器上應(yīng)用的數(shù)據(jù)變更,請使用 WITH CHANGE_TRACKING_CONTEXT 子句。在執(zhí)行 INSERT、UPDATE 或 DELETE 語句前,將 CHANGE_TRACKING_CONTEXT 設(shè)置為 @sync_client_id 或@sync_client_id_binary 會(huì)話變量的值。此信息存儲在變更跟蹤表中,以便應(yīng)用程序可以跟蹤變更所處的上下文。對于 Sync Services 來說,這通常是客戶端 ID;但是,您可以存儲適合 varbinary(128) 列的任何值。 WITH CHANGE_TRACKING_CONTEXT (@sync_client_id_binary) INSERT INTO Sales.Customer (CustomerId, CustomerName, SalesPerson, CustomerType) VALUES (@CustomerId, @CustomerName, @SalesPerson, @CustomerType) SET @sync_row_count = @@rowcount 了解和運(yùn)行示例應(yīng)用程序本節(jié)包含配置和執(zhí)行同步所需的應(yīng)用程序代碼。只通過閱讀示例代碼,就可以學(xué)習(xí)到很多相關(guān)知識。但是,運(yùn)行示例并查看其運(yùn)行情況則更加直觀。在運(yùn)行代碼前,請確保安裝了以下產(chǎn)品: Sync Services 該應(yīng)用程序需要參考 Microsoft.Synchronization.Data.dll、Microsoft.Synchronization.dll、Microsoft.Synchronization.Data.Server.dll 和 Microsoft.Synchronization.Data.SqlServerCe.dll。 SQL Server 2008 示例代碼在連接字符串中使用 localhost。若要使用遠(yuǎn)程服務(wù)器,請將 localhost 變更為適當(dāng)?shù)姆?wù)器名稱。Sync Services 示例數(shù)據(jù)庫。有關(guān)更多信息,請參見用于Sync Services 幫助主題的安裝腳本。如果您曾經(jīng)閱讀過用于客戶端與服務(wù)器同步的體系結(jié)構(gòu)和類主題,應(yīng)該已經(jīng)對該應(yīng)用程序中使用的主要類有所了解。該應(yīng)用程序由以下類組成:SampleSyncAgent此類派生自 SyncAgent。SampleServerSyncProvider。此類派生自 DbServerSyncProvider 并包含 SyncAdapter 和一組查詢變更跟蹤表的命令。SampleClientSyncProvider此類派生自 SqlCeClientSyncProvider 并包含 SyncTable。SampleStats此類使用 SyncAgent 返回的統(tǒng)計(jì)信息。Program。此類設(shè)置同步并調(diào)用 Utility 類的方法。Utility. 此類負(fù)責(zé)處理所有不與同步直接相關(guān)的功能,例如保存連接字符串信息以及更改服務(wù)器和客戶端數(shù)據(jù)庫等。有關(guān)更多信息,請參見 用于Sync Services 幫助主題的 Utility 類。API 的要點(diǎn)在您查看完整代碼示例之前,建議您首先查看以下示例。這些示例闡釋在本應(yīng)用程序中使用的 API 的若干要點(diǎn)。所演示的所有示例代碼都包含在 SampleServerSyncProvider 類中。除了在本節(jié)中演示的命令外,該完整代碼示例還包含可將插入應(yīng)用于服務(wù)器的命令以及選擇和應(yīng)用刪除的命令。第一個(gè)示例直接應(yīng)用于 DbServerSyncProvider 屬性SelectNewAnchorCommand。其他示例應(yīng)用于 Sales.Customer 表的SyncAdapter 對象。從服務(wù)器中檢索新的定位點(diǎn)值以下代碼示例指定從服務(wù)器中檢索新定位點(diǎn)值的命令。SyncSession 類包含幾個(gè)可在同步命令中使用的字符串常量。SyncNewReceivedAnchor 是這些常量之一。此外,還可以在查詢中直接使用 @sync_new_received_anchor 文本。C#VB SqlCommand selectNewAnchorCommand = new SqlCommand(); string newAnchorVariable = "@" + SyncSession.SyncNewReceivedAnchor; selectNewAnchorCommand.CommandText = "SELECT " + newAnchorVariable + " = change_tracking_current_version()"; selectNewAnchorCommand.Parameters.Add(newAnchorVariable, SqlDbType.BigInt); selectNewAnchorCommand.Parameters[newAnchorVariable].Direction = ParameterDirection.Output; selectNewAnchorCommand.Connection = serverConn; this.SelectNewAnchorCommand = selectNewAnchorCommand; 指定一條從服務(wù)器上選擇要應(yīng)用于客戶端的增量插入的命令下面的代碼示例指定一條從服務(wù)器上選擇要應(yīng)用于客戶端的增量插入的命令。用于增量變更的所有查詢都將檢查所需的變更是否已從變更跟蹤表中清除。此檢查從以下子句開始,并且在已清除變更后將引發(fā)錯(cuò)誤:IF CHANGE_TRACKING_MIN_VALID_VERSION (object_id (@sync_table_name)) @sync_last_received_anchorC#VB SqlCommand customerIncrInserts = new SqlCommand(); customerIncrInserts.CommandText = "IF @sync_initialized = 0 " + "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] " + "FROM Sales.Customer LEFT OUTER JOIN " + "CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT @sync_client_id_binary) " + "ELSE " + "BEGIN " + "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] " + "FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION " + "= @sync_new_received_anchor " + "AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT @sync_client_id_binary)); " + "IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(@sync_table_name)) " + " @sync_last_received_anchor " + "RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. " + "To recover from this error, the client must reinitialize its local database and try again' " + ",16,3,@sync_table_name) " + "END"; customerIncrInserts.Parameters.Add("@" + SyncSession.SyncInitialized, SqlDbType.Int); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar); customerIncrInserts.Connection = serverConn; customerSyncAdapter.SelectIncrementalInsertsCommand = customerIncrInserts; 指定一條從服務(wù)器上選擇要應(yīng)用于客戶端的增量更新的命令下面的代碼示例指定一條從服務(wù)器上選擇要應(yīng)用于客戶端的增量更新的命令。C#VB SqlCommand customerIncrUpdates = new SqlCommand(); customerIncrUpdates.CommandText = "IF @sync_initialized 0 " + "BEGIN " + "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] " + "FROM Sales.Customer JOIN " + "CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (CT.SYS_CHANGE_OPERATION = 'U' AND CT.SYS_CHANGE_VERSION " + "= @sync_new_received_anchor " + "AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT @sync_client_id_binary)); " + "IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(@sync_table_name)) " + " @sync_last_received_anchor " + "RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. " + "To recover from this error, the client must reinitialize its local database and try again'" + ",16,3,@sync_table_name) " + "END"; customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncInitialized, SqlDbType.Int); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar); customerIncrUpdates.Connection = serverConn; customerSyncAdapter.SelectIncrementalUpdatesCommand = customerIncrUpdates; 指定一條將增量更新從客戶端應(yīng)用于服務(wù)器的命令在以下代碼示例中,UPDATE 語句更新基表,并返回受影響的行的計(jì)數(shù)。如果行計(jì)數(shù)為 0,則表示發(fā)生了錯(cuò)誤或沖突。有關(guān)更多信息,請參見如何處理數(shù)據(jù)沖突和錯(cuò)誤。C#VB SqlCommand customerUpdates = new SqlCommand(); customerUpdates.CommandText = ";WITH CHANGE_TRACKING_CONTEXT (@sync_client_id_binary) " + "UPDATE Sales.Customer " + "SET [CustomerName] = @CustomerName, [SalesPerson] = @SalesPerson, [CustomerType] = @CustomerType " + "FROM Sales.Customer " + "JOIN CHANGETABLE(VERSION Sales.Customer, ([CustomerId]), (@CustomerId)) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (@sync_force_write = 1 " + "OR CT.SYS_CHANGE_VERSION IS NULL OR CT.SYS_CHANGE_VERSION = @sync_last_received_anchor " + "OR (CT.SYS_CHANGE_CONTEXT IS NOT NULL AND CT.SYS_CHANGE_CONTEXT = @sync_client_id_binary)) " + "SET @sync_row_count = @@rowcount; " + "IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(@sync_table_name)) @sync_last_received_anchor " + "RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. " + "To recover from this error, the client must reinitialize its local database and try again'" + ",16,3,@sync_table_name)"; customerUpdates.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary); customerUpdates.Parameters.Add("@CustomerName", SqlDbType.NVarChar); customerUpdates.Parameters.Add("@SalesPerson", SqlDbType.NVarChar); customerUpdates.Parameters.Add("@CustomerType", SqlDbType.NVarChar); customerUpdates.Parameters.Add("@CustomerId", SqlDbType.UniqueIdentifier); customerUpdates.Parameters.Add("@" + SyncSession.SyncForceWrite, SqlDbType.Bit); customerUpdates.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerUpdates.Parameters.Add("@" + SyncSession.SyncRowCount, SqlDbType.Int); customerUpdates.Parameters["@" + SyncSession.SyncRowCount].Direction = ParameterDirection.Output; customerUpdates.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar); customerUpdates.Connection = serverConn; customerSyncAdapter.UpdateCommand = customerUpdates; 選擇沖突行下面的命令從服務(wù)器數(shù)據(jù)庫中選擇沖突行(如果這些行仍存在于基表中)。C#VB SqlCommand customerUpdateConflicts = new SqlCommand(); customerUpdateConflicts.CommandText = "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType], " + "CT.SYS_CHANGE_CONTEXT, CT.SYS_CHANGE_VERSION " + "FROM Sales.Customer JOIN CHANGETABLE(VERSION Sales.Customer, ([CustomerId]), (@CustomerId)) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId]"; customerUpdateConflicts.Parameters.Add("@CustomerId", SqlDbType.UniqueIdentifier); customerUpdateConflicts.Connection = serverConn; customerSyncAdapter.SelectConflictUpdatedRowsCommand = customerUpdateConflicts; 下面的命令從服務(wù)器數(shù)據(jù)庫中選擇沖突行(如果這些行已從基表中刪除)。C#VB SqlCommand customerDeleteConflicts = new SqlCommand(); customerDeleteConflicts.CommandText = "SELECT CT.[CustomerId], " + "CT.SYS_CHANGE_CONTEXT, CT.SYS_CHANGE_VERSION " + "FROM CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "WHERE (CT.[CustomerId] = @CustomerId AND CT.SYS_CHANGE_OPERATION = 'D')"; customerDeleteConflicts.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerDeleteConflicts.Parameters.Add("@CustomerId", SqlDbType.UniqueIdentifier); customerDeleteConflicts.Connection = serverConn; customerSyncAdapter.SelectConflictDeletedRowsCommand = customerDeleteConflicts; 有關(guān)如何處理數(shù)據(jù)沖突的更多信息,請參見如何處理數(shù)據(jù)沖突和錯(cuò)誤。完整的代碼示例下面的完整代碼示例包括了上面介紹的代碼示例以及用于執(zhí)行同步的其他代碼。C#VBusing System; using System.IO; using System.Text; using System.Data; using System.Data.SqlC
你引用的程序集不是64位的而導(dǎo)致的問題。按以下步驟解決這個(gè)問題
1)刪除項(xiàng)目System.Data.SqlServerCe.dll引用
2)重新引用C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private文件夾中的System.Data.SqlServerCe.dll,這是64位本。
【注意】不要引用C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Private文件夾中的System.Data.SqlServerCe.dll,這是32位版本