GVKun编程网logo

一、微软同步框架Sync Framework之SQL SERVER Compact to MSSQL

5

对于一、微软同步框架SyncFramework之SQLSERVERCompacttoMSSQL感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于.net–连接字符串中的SQLServerCompa

对于一、微软同步框架Sync Framework之SQL SERVER Compact to MSSQL感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于.net – 连接字符串中的SQL Server Compact“数据目录”宏 – 需要更多信息、asp-classic – 与SQL Server Compact Edition 4.0的Ado连接、c# – 使用TransactionScopeOption.Suppress与Sql Server Compact 4、FluentNHibernate是否支持SQL Server Compact Edition 4.0?的有用信息。

本文目录一览:

一、微软同步框架Sync Framework之SQL SERVER Compact to MSSQL

一、微软同步框架Sync Framework之SQL SERVER Compact to MSSQL

前言:

    Sync Framework 是一个功能完善的同步平台,实现了应用程序、服务和设备的协作和脱机访问。Sync Framework 提供了一些可支持在脱机状态下漫游、共享数据和获取数据的技术和工具。通过使用 Sync Framework,开发人员可以构建同步生态系统,通过在任意网络上使用任意协议,将任意应用程序与任意存储区中的数据集成在一起。

                                                                                     ---摘自《微软.Sync Framework帮助文档》

     接触SQLSERVER已经有六年多了。对于SQLSERVER中提供的各种功能,多少都有实践过。为此,有过成功喜悦、也有过苦逼的岁月。又一个周末,独自坐在办公室里,品着苦味的菊花茶。室外红尘喧嚣不止,室内孤寂异常。在这百无聊赖的周末,想着,做点儿什么,来证明自己不曾辜负这轻浮的繁城之色。(闲言碎语)

     接下来,我想介绍的才是我们今晚的主题--Sync Framework同步框架。

很多朋友,看到这个或许并不陌生吧。肯定也会有很多朋友不曾留意她。今天,就让我简单的给大家介绍+演示下。

 文章的开头,了解了什么是Sync Framework同步框架后,用处自然不必多少。接下来,就是了解他有什么好处?

下面这段话,同样摘自微软Sync Framework同步框架。

同步在理论上十分简单:它是在适当时间在两个或更多参与者(例如计算机、设备或服务)之间复制正确的数据集的过程。但是,实践起来却十分困难。其中的难点包括:集成不同类型的数据;检测到并解决冲突;与能力不尽相同或者要求数据的不同子集的参与者合作;以及处理不可靠的网络。同步可能对于公司成功起着至关重要的作用,但许多开发人员不知道如何编写满足其公司需要的同步解决方案。而 Sync Framework 可助您一臂之力。

Sync Framework 将为要求数据同步的多种不同形式的应用程序带来好处。 例如,个人信息管理 (PIM) 软件可以使用 Sync Framework 将 PIM 数据更新信息传播到所有参与者。共享诸如文档等数据的业务应用程序可以使用 Sync Framework 确保所有团队成员接收文档更新并正确处理所有并发更新冲突。在个人计算机上运行并管理移动设备上的介质的介质管理软件可以使用 Sync Framework 轻松地在设备上执行相应更新。

Sync Framework 通过提供可供开发人员选择的一组组件来满足这些应用程序的要求。某些组件同步特定类型的数据,而其他组件可用于创建完全自定义的解决方案。Sync Framework 为同步提供功能强大的设计和灵活的方法。设计带来的好处如下:

  • 可用于将多个数据源集成到一个同步生态系统中的可扩展模型。

  • 用于所有组件的一个托管 API,以及用于所选组件的一个本机 API。

  • 用于自动和自定义解决方案的冲突解决。

  • 用于同步数据的子集(例如仅限包含图像的那些文件)的筛选器。

  • 紧凑、高效的元数据模型,使您可为几乎所有参与者实现同步,同时不会对数据存储区进行重大变更:

    • 任何数据存储区

      将同步添加到多种应用程序、服务和设备。

    • 任何数据类型

      引入要同步的新数据类型。利用独有的基于元数据的同步技术来同步任何类型的数据。

    • 任何协议

      使用现有的体系结构和协议来同步数据。通过传输不可知的体系结构,允许将同步集成到多种协议中,包括无线设备和嵌入设备。

    • 任何网络配置

      在真正的对等或中心辐射型配置中为您的应用程序、设备和服务实现同步。轻松地从网络中断中恢复。通过高效选择要同步的变更减少网络通信量。

Sync Framework文档对于它的用法,介绍的相当详细。

  如果想使用它,那我们就要去官方下载Sync Framework SDK。在这里,本人电脑上已经安装了Sync Framework 2.1(x86/x64)都装了。

   在这里,我们试想这样一个场景。我们用C#开发了一个桌面软件。为了存储数据,我们采用了了微软的嵌入式数据库SQL SERVER Compact。至于有的朋友说,为什么不用SQLLit,这不是我们今天讨论的话题。当用户在不联网的请情况下,我们将数据保存到本地,当用户连接上网络后,为了某些需求,我们需要把这段时间,用户脱机的一些数据,同步更新到服务端。

假设,服务端,我们用的是SQLSERVER 2008 R2。接下来,我在服务端,创建了一个数据库TestA,在TestA中,又创建了ext_DoRecord表,用于存储用户的某些操作记录。

接着,我又创建一个控制台应用程序。根据Sync Framework文档的要求,我们需要引入

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using Microsoft.Synchronization.Data.SqlServerCe;
using System.Data.SqlServerCe;

这些命名空间。

来看看我们的控制台小程序吧!代码如下:

1、首先,我们需要进行服务端的配置

/// <summary>
/// 配置服务端
/// </summary>
static void ConfigureServer()
{
            #region 1、配置服务端
    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=TestA; Integrated Security=True");
 
    //1、我们定义一个作用域,名字叫做,ext_DoRecordScope
    DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("ext_DoRecordScope");
 
    //2、从服务端,获取要同步的表描述
    DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("ext_DoRecord", serverConn);
 
    //3、把表,加入作用域
    scopeDesc.Tables.Add(tableDesc);
 
    //4、初始化服务度作用域
    SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);
 
    //5、如果表已经存在,则跳过创建表的步骤
    serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);
 
    //6、启动代理
    serverProvision.Apply();
            #endregion 1、配置服务端
}

2、同样,我们为客户端创建一个配置函数。

/// <summary>
/// 配置SQL Compact客户端
/// </summary>
static void ConfigureClient()
{
 
    SqlCeEngine sce = new SqlCeEngine(dbconnection);
    if (!System.IO.File.Exists(db_file)) sce.CreateDatabase();//创建库
 
    // create a connection to the SyncCompactDB database
    SqlCeConnection clientConn = new SqlCeConnection(dbconnection);
 
    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=TestA; Integrated Security=True");
 
    //配置同步作用域 
    DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope("ext_DoRecordScope", serverConn);
 
    // 客户端代理
    SqlCeSyncScopeProvisioning clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);
 
    //启动代理
    clientProvision.Apply();
 
}

3、最后,我们需要一个同步方法。

/// <summary>
/// 同步数据
/// </summary>
 
static void Sync()
{
    string strDatabaseFile = @"Data Source=''" + db_file + "''";
 
    //zao
    for (var i = 0; i < 10; i++)
    {
        string strInsertCommand = "INSERT INTO ext_DoRecord(ID,UserID) VALUES(''" + Guid.NewGuid() + "'',''" + Guid.NewGuid() + "'');";
        DbSqlCompactHelper.ExecuteNonQuery(strInsertCommand, null, strDatabaseFile);
    }
 
    //创建客户端链接
    SqlCeConnection clientConn = new SqlCeConnection(strDatabaseFile);
 
    // 创建发布
    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=TestA; Integrated Security=True");
 
    //创建同步定位
    SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
 
    //SQL Compact引擎
    SqlCeEngine se = new SqlCeEngine(strDatabaseFile);
 
 
    // 设置本地作用域提供服务
    syncOrchestrator.LocalProvider = new SqlCeSyncProvider("ext_DoRecordScope", clientConn);
 
    //设置远程服务作用域
    syncOrchestrator.RemoteProvider = new SqlSyncProvider("ext_DoRecordScope", serverConn);
 
    //设置上传作用域
    syncOrchestrator.Direction = SyncDirectionOrder.Upload;
 
    // 绑定本地同步失败时,发生事件
    ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
 
    //执行同步
    SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
 
    //打印同步统计信息
    Console.WriteLine("启动时间: " + syncStats.SyncStartTime);
    Console.WriteLine("总计上传数据: " + syncStats.UploadChangesTotal);
    Console.WriteLine("总计下载数据: " + syncStats.DownloadChangesTotal);
    Console.WriteLine("完成时间: " + syncStats.SyncEndTime);
    Console.WriteLine(String.Empty);
 
 
}

在这里需要说一下,我们在启动程序的时候,首先要对服务端进行配置,也就是说先调用ConfigureServer。配置成功后,你会发现,在服务端的数据库TestA中,多了几张表。效果如下:

这些都是同步时的一些配置信息。其次,再进行客户端的配置,配置完成后,同样在客户端的数据库中,会多出一些类似这样的表来。

接下来,让我们看一看东风吧(万事俱备)。

在同步方法中,我用一个for循环,为客户端创建了10条数据。另外,我们的目的是,要把客户端的数据同步到服务端。在这里是单项的,也就是Upload数据。Sync Framework支持上传下载双向同步。

   运行我们的控制台程序,跑跑看!

在看看数据库中,是否多了数据。

  在这个过程中,可能会遇到的问题:

1、检索 COM 类工厂中 CLSID 为 {EC413D66-6221-4EBB-AC55-4900FB321011} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 ...

(这是由于未正确安装Sync Framework或,程序编译时x64和x86所导致的兼容问题)

2、System.Data.SqlServerCe.dll4.0和 System.Data.SqlServerCe.dll3.5.1的兼容问题。

(这个相对好解决,只要找到对应的dll,就可以了。)


    至此,我们的Sync Framework同步框架演示程序,已经告一段落。如果想了解更多,请继续关注我的博客:)。

 

  

 

 

   

 

.net – 连接字符串中的SQL Server Compact“数据目录”宏 – 需要更多信息

.net – 连接字符串中的SQL Server Compact“数据目录”宏 – 需要更多信息

因此,如 on this msdn page所述,为您定义连接字符串时
sql Server Compact 3.5,您可以使用“数据目录”宏,如下所示:

引自this msdn page:

Data Directory Support
sql Server Compact 3.5 Now supports the Data Directory macro. This means that if you add the string |DataDirectory| (enclosed in pipe symbols) to a file path,it will resolve to the path of the database.

For example,consider the connection string:

“Data Source= c:\program files\MyApp\Mydb.sdf”

When using Data Directory,you can instead use the following connection string:

“Data Source = |DataDirectory|\Mydb.sdf”

For more information,see How to: Deploy a sql Server Compact 3.5 Database with an Application.

但是,msdn上的“获取更多信息”链接实际上并没有提供更多信息.

所以我的问题是:

如何|数据目录|宏在运行时翻译?对于WinForm应用程序,它似乎只是给出可执行文件的位置.还是比这更复杂?

解决方法

若要设置DataDirectory属性,请调用AppDomain.SetData方法.如果未设置DataDirectory属性,则将应用以下默认规则来访问数据库文件夹:

>对于放入的应用程序用户计算机上的文件夹数据库文件夹使用该应用程夹.>对于正在运行的应用程序在ClickOnce下,数据库文件夹使用特定的数据文件夹创建.

asp-classic – 与SQL Server Compact Edition 4.0的Ado连接

asp-classic – 与SQL Server Compact Edition 4.0的Ado连接

我想从旧的asp-classic网站连接到sql Server Compact Edition 4.0,但我总是得到错误:

“Microsoft OLE DB Provider for ODBC Drivers error’80004005′
[Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序. “

我试过了

sCon = "Data Source=c:\temp\sqlcompact.sdf;Encrypt Database=True;Password=testtest;Persist Security Info=False;"

更新:
错误:多步OLE DB操作生成错误.检查每个OLE DB状态值(如果可用).没有工作

sCon = "Provider=Microsoft.sqlSERVER.CE.OLEDB.4.0;Data Source=c:\temp\sqlcompact.sdf;Password=testtest;"

没有任何成功.

通常可以从ADO连接到sql Server CE 4.0吗?

更新:
示例代码
打开连接:

dim sCon

dim gCON : set gCON=CreateObject ("ADODB.Connection")

sCon = "Provider=Microsoft.sqlSERVER.CE.OLEDB.4.0;Data Source=c:\temp\sqlcompact.sdf;Pwd=testtest;"

gCon.ConnectionString = sCon
gCon.Open 
gCon.Close

解决方法

是的,您可以通过ADO连接到sql CE 4.
Set Cnxn = CreateObject("ADODB.Connection") 
Set cmd = CreateObject("ADODB.Command")
strCnxn = "Provider=Microsoft.sqlSERVER.CE.OLEDB.4.0;" & _ 
"Data Source=C:\nw40.sdf;" 
Cnxn.Open strCnxn 
cmd.ActiveConnection = Cnxn 
cmd.CommandText = "SELECT TABLE_NAME FROM informatION_SCHEMA.TABLES" 
While Not pRS.EOF 
   WScript.Echo pRS(0) 
   pRS.MoveNext 
wend

对于密码保护的文件,请使用:

strCnxn = "Provider=Microsoft.sqlSERVER.CE.OLEDB.4.0;" & 
 _ "Data Source=C:\nw40.sdf;ssce:database password=secret"

c# – 使用TransactionScopeOption.Suppress与Sql Server Compact 4

c# – 使用TransactionScopeOption.Suppress与Sql Server Compact 4

我在使用带有Entity Framework和System.Transactions.TransactionScope的sql Server CE 4来抑制部分事务时遇到了问题.

下面的简化代码来自演示问题的单元测试.

我们的想法是在不影响outerScope块(“环境”事务)的情况下启用innerScope块(没有事务)成功或失败.这是TransactionScopeOption.Suppress的既定目的.

但是,代码失败,因为似乎整个SoMetable表被outerScope中的第一个插入锁定.在代码中指示的位置,抛出此错误:

“sql Server Compact等待锁定超时.设备的默认锁定时间为2000ms,桌面的默认锁定时间为5000ms.使用ssce:default lock timeout属性可以在连接字符串中增加默认锁定超时.[Session id = 2,线程id = 2248,进程id = 13516,表名= SoMetable,冲突类型= x锁(x块),资源= PAG(idx):1046]“

[TestMethod()]
[DeploymentItem("MyLocalDb.sdf")]
public void MyLocalDb_TransactionSuppressed()
{
    int count = 0;

    // This is the ambient transaction
    using (TransactionScope outerScope = new TransactionScope(TransactionScopeOption.required))
    {
        using (MyObjectContext outerContext = new MyObjectContext())
        {
            // Do something in the outer scope
            outerContext.Connection.open();
            outerContext.AddToSoMetable(CreateSoMetableRow());
            outerContext.SaveChanges();
            try
            {
                // Ambient transaction is suppressed for the inner scope of sqlCE operations
                using (TransactionScope innerScope = new TransactionScope(TransactionScopeOption.Suppress))
                {
                    using (MyObjectContext innerContext = new MyObjectContext())
                    {
                        innerContext.Connection.open();
                        // This insert will work
                        innerContext.AddToSoMetable(CreateSoMetableRow());
                        innerContext.SaveChanges(); // ====> EXCEPTION THROWN HERE
                        // There will be other,possibly failing operations here
                    }
                    innerScope.Complete();
                }
            }
            catch { }
        }
        outerScope.Complete();
    }

    count = GetCountFromSoMetable();
    // The insert in the outer scope should succeed,and the one from the inner scope
    Assert.AreEqual(2,count);
}

因此,根据http://msdn.microsoft.com/en-us/library/ms172001,似乎“事务范围中的事务执行时隔离级别设置为Serializable”

但是,使用以下代码段更改TransactionScope的隔离级别无济于事:

public void MyLocalDb_TransactionSuppressed()
{
    Transactionoptions opts = new Transactionoptions();
    opts.IsolationLevel = IsolationLevel.ReadCommitted;
    int count = 0;

    // This is the ambient transaction
    using (TransactionScope outerScope = new TransactionScope(TransactionScopeOption.required,opts))
    ...

在同一位置抛出相同的异常.

似乎避免这种情况的唯一方法是在进入innerScope块之前调用outerScope.Complete().但这会破坏目的.

我在这里错过了什么?
谢谢.

解决方法

AFAIK sql Server Compact不支持嵌套事务.

FluentNHibernate是否支持SQL Server Compact Edition 4.0?

FluentNHibernate是否支持SQL Server Compact Edition 4.0?

如何解决FluentNHibernate是否支持SQL Server Compact Edition 4.0??

| 我知道他们支持sql CE。我认为他们上升到3.5 ???我刚刚下载了CE 4.0,我想在我的项目中对其进行测试,但是我无法在FluentNHibernate中对其进行正确的配置... 如果支持4.0: 我必须下载哪个版本,并且有人可以给我提供一个示例来说明如何实现它?     

解决方法

FNH支持CE 4.0,请尝试以下配置:
var config = Fluently.Configure()
 .Database(MsSqlCeConfiguration.Standard.ConnectionString(\"Data Source=DatabaseFileName.sdf\"))
 .Mappings(m =>
 {
     m.FluentMappings.AddFromAssembly(typeof(Entity).Assembly);
 })
 .BuildConfiguration();
具有实体映射的程序集应通过AddFromAssembly添加。 DatabaseFileName.sdf是数据库文件名的路径和文件名。路径可以是应用程序的工作目录,也可以是绝对路径或相对路径(Windows应用程序:System.AppDomain.CurrentDomain.BaseDirectory; Web应用程序:System.AppDomain.CurrentDomain.RelativeSearchPath)。 在FNH1.0,NH2.1和SQL Server CE 4.0上进行了测试。 编辑: 数据库文件必须由数据库引擎创建:
using (var engine = new SqlCeEngine(connectionString))
{
    engine.CreateDatabase();
}
这是CE 3.5的示例,但也应与CE 4.0一起使用:http://nhdatabasescopes.codeplex.com/SourceControl/changeset/view/f9e824a457e8#DatabaseScopes%2fMsSqlCeInFilePrivateScope.cs。     

今天关于一、微软同步框架Sync Framework之SQL SERVER Compact to MSSQL的讲解已经结束,谢谢您的阅读,如果想了解更多关于.net – 连接字符串中的SQL Server Compact“数据目录”宏 – 需要更多信息、asp-classic – 与SQL Server Compact Edition 4.0的Ado连接、c# – 使用TransactionScopeOption.Suppress与Sql Server Compact 4、FluentNHibernate是否支持SQL Server Compact Edition 4.0?的相关知识,请在本站搜索。

本文标签: