좋은 날 모두, 내가 아는ASP.NET 2.0, SQL Server Express에 2008 동기화 프레임 워크 1.0 C# 간단한 시나리오 예
, 내가 얘기하고있는 버전이 지금 쯤은 오히려 사용되지 않는하지만 난에 붙어있는 도구입니다 직장에서 일하십시오. 이것은 StackOverflow에 대한 나의 첫 번째 질문이며, 나는 형식화 권리를 얻으려고 희망한다 ;-) 긴 텍스트를 위해 나를 용서 해주고, 나는 많은 세부 사항을주고 익숙해 져있다.
IT 분야에서 일하는 거의 10 년 동안 나는 잘 선택된 키워드와 표현을 인터넷 검색하여 내 질문에 대한 해결책을 찾을 수있었습니다. 앞서 언급 한 Sync Framework가 인터넷 커뮤니티에 잘 알려지지 않은 것처럼 보입니다. 그렇지 않으면 대부분의 필사자에게 가장 단순한 개념을 이해하는 것이 정말 고통 스럽습니다. 광범위한 연구 끝에 Sync Framework 1.0과 C# 언어를 사용하여 SQL Express를 동기화하는 단일 예제를 발견해야합니다 (MSDN은 아님)! 나는 ASP.NET/C#에 상당히 익숙하지만 개념을 이해하고 SQL Server 2008 데이터베이스에서 데이터를 성공적으로 저장하고 검색하는 작업 웹 응용 프로그램이 있습니다. 그것은 2 년 동안 고객에 의해 지금 사용되어 왔습니다. 이제 클라이언트가 데이터를 오프라인으로 가져와 오프라인으로 업데이트 한 다음 서버와 동기화 할 수 있어야합니다. 두 끝에서 UPDATE, INSERT 및 DELETE가 발생합니다.
내가 찾고자하는 것은 매우 간단하다 (또는 그렇게 생각했다.) SQL Server 변경 추적 정보 (사용자 지정 변경 추적 아님)를 사용하는 C# 코드 예제는 서버 (SQL Server 2008)와 클라이언트 컴퓨터 (SQL 서버 2008 익스프레스, 컴팩트 에디션). 가장 간단한 경우는 컬럼이 거의없는 단일 테이블입니다. SQL Server 부분을 이해하고 클라이언트 웹 응용 프로그램에서 동기화 요청을 받도록 데이터베이스 양쪽을 준비했습니다 (변경 추적 사용, PrimaryKeyID에 데이터 형식 GUID, 서버의 응용 프로그램 사용자 계정에 VIEW_CHANGE_TRACKING 권한이 있음). 등등)
나는이 둘 사이의 인터페이스 역할을하는 동기화 애플리케이션 (C#)을 관리하는 웹 애플리케이션이라는 것을 알고있다. 남은 유일한 일은 두 개의 연결 문자열을 제공하고 어떤 테이블을 동기화할지 알려주고 양방향 동기화를 지정하는 것입니다. 분명히, 그것은 hehe보다 더 복잡합니다. 절망적 인 시도로 필자는 Microsoft의 다음 코드를 기반으로 SQL Express (이 예제는 Compact 용)에 적용하려고 시도했습니다. 나는 패배를 인정하고 부끄럽게 상기 내용을 토대로
http://msdn.microsoft.com/en-us/library/bb726015%28v=sql.100%29.aspx
:-(내 머리를 낮추기 위해 가까운 오전, 내가 필요하지 않은 모든 것을 제거 (두 번째 섹션 "SQL 서버 변경 내용 추적을 사용하여 완벽한 예") : 일을 SSMS에서 스크립트를 실행하는 SQL Server 자체에서 수동으로 변경 사항을 적용했습니다. (그리고 따라서 생성 된 변경 추적 정보와 웹 앱이 동기화를 요청할 때 사용할 수있는 변경 추적 정보가 있어야합니다.) 질문 1 : 내가 잘못 말하고 있습니까? 마지막으로 SQL Express와 관련된 객체를 사용하기 위해 일부 정보를 변경했습니다. 컴팩트 대신
질문 2 : Microsoft의 코드는이 복제본의 초기 (첫 번째) 또는 후속 동기화인지 여부를 분명히 알 수 있습니다. 나는 그것이 어떻게 할 수 있는지 모른다!
결국 간단한 형태로 남아있는 코드는 다음과 같습니다 (질문 3, 4, 5 ;-)로 표시되지만 오류가 있음). 도와 주셔서 미리 감사드립니다. 모든 의견 및/또는 제안을 환영합니다. 이 문제가 해결되면 꽤 많은 사람들에게 도움이 될 것입니다. 나는 그것을 끝까지 연구 할 것입니다. (상사가 나에게 선택권을주지 않을 것입니다. ;-) 나는 동기화에 성공한다면 여기에 해결책을 게시하겠다고 약속합니다!
감사합니다. 멋진 하루 되세요!
친절한 안부를
Zyxy
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
//using System.Data.SqlServerCe;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.Server;
//using Microsoft.Synchronization.Data.SqlServerCe;
namespace some_namespace
{
public class SyncProgram
{
public SyncProgram()
{
// empty constructor
}
public static bool MainSync() // Entry point, say, called by a Sync button on an ASPX page.
{
bool boolSyncRes = false; // tells whether sync was a success or not
// Initial sync: they create a new instance of the Orchestrator.
ZyxySyncOrchestrator zyxySyncOrchestrator = new ZyxySyncOrchestrator();
// Subsequent synchronization.
// They don't. there was only irrelevant stats stuff here.
boolSyncRes = true;
return boolSyncRes;
}
}
public class ZyxySyncOrchestrator : SyncOrchestrator
{
public ZyxySyncOrchestrator()
{
Utility util = new Utility();
this.LocalProvider = new ZyxyServerSyncProvider(); // QUESTION 3: ??? cannot implicitly convert type DbServerSyncProvider to Microsoft.Synchronization.SyncProvider
//Instantiate a server synchronization provider and specify it
//as the remote provider for this synchronization agent.
this.RemoteProvider = new ZyxyServerSyncProvider(); // cannot implicitly convert type DbServerSyncProvider to Microsoft.Synchronization.SyncProvider
// QUESTION 4: Is the following code actually creating the base (user) table ZyxySync
// (as opposed to its change tracking metadata table)??
// I wasn't sure whether this part of the code on Microsoft's webpage was part of
// populating the db with sample data and structure or if it's really meant to deal with
// the change tracking metadata.
SyncTable zyxySyncTable = new SyncTable("ZyxySync");
zyxySyncTable.CreationOption = TableCreationOption.DropExistingOrCreateNewTable;
zyxySyncTable.SyncDirection = SyncDirection.DownloadOnly;
this.Configuration.SyncTables.Add(zyxySyncTable);
}
}
//Create a class that is derived from Microsoft.Synchronization.Server.DbServerSyncProvider.
public class ZyxyServerSyncProvider : DbServerSyncProvider
{
public ZyxyServerSyncProvider()
{
Utility util = new Utility();
SqlConnection serverConn = new SqlConnection(util.ServerConnString);
this.Connection = serverConn;
//Retrieve a new anchor value from the server. We use a timestamp value
//that is retrieved and stored in the client database.
//During each sync the new and last anchor values are used to determine the set of changes
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;
//Create a SyncAdapter for the ZyxySync table by using
//the SqlSyncAdapterBuilder.
// Specify a name for the SyncAdapter that matches the
// the name specified for the corresponding SyncTable.
SqlSyncAdapterBuilder zyxyBuilder = new SqlSyncAdapterBuilder(serverConn);
zyxyBuilder.TableName = "dbo.ZyxySync";
zyxyBuilder.ChangeTrackingType = ChangeTrackingType.SqlServerChangeTracking;
SyncAdapter zyxySyncAdapter = zyxyBuilder.ToSyncAdapter();
zyxySyncAdapter.TableName = "ZyxySync";
this.SyncAdapters.Add(zyxySyncAdapter);
}
}
// Class derived from Microsoft.Synchronization.Data.Server.DbServerSyncProvider
// QUESTION 5: Or should have I used the two below? I believe they only apply to SQL Compact...
//Microsoft.Synchronization.Data.ClientSyncProvider
//Microsoft.Synchronization.Data.ServerSyncProvider
//http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.clientsyncprovider%28v=sql.100%29.aspx
//http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.server.dbserversyncprovider%28d=printer,v=sql.100%29.aspx
public class ZyxyClientSyncProvider : DbServerSyncProvider
{
public ZyxyClientSyncProvider()
{
Utility util = new Utility();
SqlConnection clientConn = new SqlConnection(util.ClientConnString);
this.Connection = clientConn;
}
}
public class Utility
{
public string ClientConnString
{
get { return @"Data Source=localhost\LocalExpressInstance;Initial Catalog=DatabaseName;User ID=UserName;Password=WontTellYou;"; }
}
public string ServerConnString
{
get { return @" Data Source=ServerName\ServerInstance;Initial Catalog=DatabaseName;User ID=UserName;Password=WontTellYou;"; }
}
}
}
: 코드의 자동 형식의 색상이 모든 잘못! Hehe 그것에 대해 미안 해요, StackOverflow에 내 첫 게시물이야 ;-) – Zyxy