WEB开发网
开发学院数据库MSSQL Server 从Pocket Access向SQL Server CE进行数据库迁移 阅读

从Pocket Access向SQL Server CE进行数据库迁移

 2007-12-27 15:32:28 来源:WEB开发网   
核心提示:从 eMbedded Visual Basic 迁移到 Visual Basic .NET 和 C#Moving from eMbedded Visual Basic to Visual Basic .NET 一文讨论了有关从 eMbedded Visual Basic 迁移到 Visual Basic .NET 的大

从 eMbedded Visual Basic 迁移到 Visual Basic .NET 和 C#

Moving from eMbedded Visual Basic to Visual Basic .NET 一文讨论了有关从 eMbedded Visual Basic 迁移到 Visual Basic .NET 的大多数常规问题。该文章的“Working with Databases”部分包含的示例代码描述了在使用 SQL Server CE 时,如何将代码从 eMbedded Visual Basic 迁移到 Visual Basic .NET。

它介绍了 Visual Basic .NET 和 C# 这两个版本的迁移代码。这样做的主要原因是让更多身为开发人员的读者能够立即从示例代码中受益。而且,如果您是传统的 eMbedded Visual Basic 开发人员并且要开始使用 .NET Compact Framework,则您还应该考虑 C#。考虑 C# 的主要原因是:在 .NET 中有如此之多的新功能,以至于您可能发现可以使用它来获得一个全新的开始,而无需使用 Visual Basic 遗产。

同步

很多以前的 Pocket PC 应用程序借助于 ActiveSync 同步桌面计算机和设备的数据。ActiveSync 包含一些支持,以便您同步数据库以及选择要在同步操作中包括的表。在 ActiveSync 中,不包含对于将 Microsoft Access 或 SQL Server 2000 数据库与设备上的 SQL Server CE 数据库进行同步的固有支持。但是,您可以使用 ActiveSync 使设备可以借助于传递连接来连接到桌面计算机。

对于 SQL Server CE,您需要使用不同的模型。SQL Server 2000 将同步功能作为 Web 服务器的插件予以支持。在 SQL Server CE Server Tools 安装过程中,在 Internet 信息服务 (IIS) 中设置了一个虚拟目录。该虚拟目录包含一个称为 SQL Server CE Server Agent 的文件 (sscesa20.dll),您可以通过 HTTP 请求来调用它,以便与 SQL Server 2000 同步数据。在客户端,可以使用 SQL Server CE Client Agent,它包含用于合并复制(设置数据订阅)和远程数据访问 (RDA) 的功能。有关合并复制的详细信息,请参阅 SQL Server CE Help(联机图书);该文章集中讨论了如何通过使用 RDA 来同步数据。

即将问世的示例(本文中的大多数代码示例都以它为基础)使用一个源自 Access 的数据库。Access 数据库被逐个表地导出到 SQL Server 2000,而 Access 中提供的功能被导出到 ODBC 数据源 — 在本例中,为 SQL Server 2000 数据库。(有关如何导出 Access 数据库的详细信息,请参阅 Access 帮助或 How To Convert an Access Database to SQL Server。)下一步是通过使用 RDA 中的 Pull 方法,将表从 SQL Server 2000 下载到 SQL Server CE 数据库,如下面的代码所示。

Dim localDatabase As String = "MobileSales.sdf"
Dim localConnectionString As String = "Data Source=" + localDatabase
Dim remoteConnectionString As String = "Provider=sqloledb;" + _
 "Data Source=(local);Initial Catalog=MobileSales;" + _
 "Integrated Security=SSPI;"
Dim tables() As String =
 New String() {"Customers", "Orders", "Products"}
If File.Exists(localDatabase) Then
 File.Delete(localDatabase)
End If
Dim engine As New SqlCeEngine(localConnectionString)
engine.CreateDatabase()
engine.Dispose()
Dim rda As New SqlCeRemoteDataAccess()
rda.InternetUrl = "http://server/ssce/sscesa20.dll"
rda.LocalConnectionString = localConnectionString
Dim table As String
For Each table In tables
 Try
   rda.Pull(table, "SELECT* FROM [" + table + "]", _
     remoteConnectionString, _
     RdaTrackOption.TrackingOffWithIndexes, "ErrorTable")
 Catch ex As SqlCeException
   MessageBox.Show(ex.Message);
 End Try
Next
rda.Dispose()

本地连接字符串指向将要创建 SQL Server CE 数据库文件的位置,而远程连接字符串则指向应用程序将从中检索数据的 SQL Server 2000 数据库 (MobileSales)。如果数据库文件已经存在,则应用程序会删除它,然后,应用程序通过使用 SqlCeEngine 对象创建数据库。应用程序设置 RDA (SqlCeRemoteDataAccess) 对象,以指向服务器或桌面计算机中驻留 SQL Server CE Server Agent (sscesa20.dll) 的虚拟目录 (ssce)。应用程序使用表数组将表从 SQL Server 2000 拉到刚刚创建的本地 SQL Server CE 数据库中。

请注意,虚拟目录使用匿名访问,并且,通过指定的连接字符串给予 IIS 中的匿名用户(例如,IUSR_MACHINENAME)访问 SQL Server 2000 中数据库的权利。在实际方案中,虚拟目录很可能需要指定的用户,并且随后在 RDA 对象(在它的 InternetLogin 和 InternetPassword 属性中)上设置凭据。

还要注意,应用程序指定用于下载索引和关闭跟踪的选项 (TrackingOffWithIndexes)。如果指定了跟踪,则应用程序以后可以使用 RDA 对象的 Push 方法将表推送回服务器,以便将更改添加到 SQL Server 2000 数据库中。有关详细信息,请参阅 SQL Server CE Help(联机图书)。

在 C# 中,代码如下所示。

string localDatabase = @"MobileSales.sdf";
string localConnectionString = "Data Source=" + localDatabase;
string remoteConnectionString = @"Provider=sqloledb;" +
 "Data Source=(local);Initial Catalog=MobileSales;" +
 "Integrated Security=SSPI;";
string[] tables = new string[] { "Customers", "Orders", "Products" };
if(File.Exists(localDatabase))
 File.Delete(localDatabase);
using(SqlCeEngineengine = new SqlCeEngine(localConnectionString))
 engine.CreateDatabase();
using(SqlCeRemoteDataAccessrda = new SqlCeRemoteDataAccess())
{
 rda.InternetUrl = "http://server/ssce/sscesa20.dll";
 rda.LocalConnectionString = localConnectionString;
 foreach (string table in tables)
 {
   try
   {
     rda.Pull(table, "SELECT* FROM [" + table + "]",       remoteConnectionString,
       RdaTrackOption.TrackingOffWithIndexes, "ErrorTable");
   }
   catch (SqlCeExceptionex)
   {
     //MessageBox.Show(ex.Message);
     showErrors(ex);
   }
 }
}

您也可以不使用上述代码,而是继续与桌面计算机上的 Access 数据库进行同步,或者用另一个数据库进行复制。常规解决方案是在服务器(或桌面计算机)上设置 XML Web 服务。该 Web 服务可以发布方法,以供在数据库中执行数据操作的设备使用。

下面的代码示例从 XML Web 服务(作为 Visual Studio .NET 中的 ASP.NET Web 服务项目创建)中使用原始的 Access 数据库。

<WebMethod> _
Public Function Sync(ByVal newCustomerNames() As String) As DataSet
 ' Set up connection and data adapter
 OleDbConnection cn = New OleDbConnection(+
   "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;" +
   "Data Source=C:Mobile Sales.mdb")
 cn.Open()
 ' Set up command and insert new customers
 Dim cmd As New OleDbCommand(
   "INSERT INTO Customers (CustomerName) VALUES(?)", cn)
 cmd.Parameters.Add("?", DbType.String)
 For Each newCustomerName As String In newCustomerNames
   cmd.Parameters(0).Value = newCustomerName
   cmd.ExecuteNonQuery
 Next
 ' Get all customers
 Dim da As New OleDbDataAdapter("SELECT* FROM Customers", cn)
 Dim ds As DataSet= New DataSet()
 da.Fill(ds, "Customers")
 ' Send back all customers
 Return ds
End Function

XML Web 服务方法(Web 方法)采用新客户的名称数组作为参数。在设置了连接和命令对象以后,应用程序使用该数组创建新的客户行。请注意代码是如何使用参数来提高插入多个客户的速度的。还要注意,使用设备上的命令对象(通过 .NET Compact Framework 中的 ADO.NET)完成该操作的语法是非常类似的。然后,应用程序再次查询数据库,并且将所有客户名称(包括新名称)返回到设备。注意这就是同步功能,并且需要将所有客户返回到该设备,因为当该设备断开连接时,其他设备可能已经添加了客户。

在 C# 中,代码如下所示。

[WebMethod]
public DataSetSync(string[] newCustomerNames)
{
 // Set up connection and data adapter
 OleDbConnection cn = new OleDbConnection( +
   "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;" +
   @"Data Source=C:Mobile Sales.mdb");
 cn.Open();
 // Set up command and insert new customers
 OleDbCommand cmd = new OleDbCommand(
   "INSERT INTO Customers (CustomerName) VALUES(?)", cn);
 cmd.Parameters.Add("?", DbType.String);
 foreach(string newCustomerName in newCustomerNames)
 {
  cmd.Parameters[0].Value = newCustomerName;
  cmd.ExecuteNonQuery();
 }
 // Get all customers
 OleDbDataAdapter da = new OleDbDataAdapter(
   "SELECT* FROM Customers", cn);
 DataSetds = new DataSet();
 da.Fill(ds, "Customers");
 // Send back all customers (including new)
 return ds;
}

采用类似的方式,应用程序可以访问任何在服务器上具有 ADO.NET 的符合 OLE DB 的数据源 — 或其他具有自己的托管提供程序的数据库(例如,Oracle)。

Tags:Pocket Access SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接