在此演练中,您将学习如何在使用 SQL Server 2005 Mobile Edition (SQL Server Mobile) 的 Visual Studio 2005 中创建应用程序。SQL Server Mobile 数据库将作为 SQL Server 2005 发布的订阅服务器,并使用合并复制来交换信息。
在此演练中,您将执行下列任务:
- 配置 SQL Server 2005 发布。
- 配置 Internet 信息服务 (IIS) 以进行复制。
- 创建 SQL Server Mobile 订阅。
- 创建应用程序。
- 部署应用程序并测试订阅。
若要按照此演练中所写的内容执行此演练,您需要满足下列条件:
- 安装有 Windows XP 和 IIS 的计算机
- Visual Studio 2005
- SQL Server 2005,与 Visual Studio 安装在同一台计算机上
在创建应用程序之前,必须在 SQL Server 2005 中配置发布。在下列步骤中,您将创建一个示例数据库,然后从该数据库发布数据。您将使用预建的脚本文件创建数据库,然后使用新建发布向导创建发布。
-
打开 SQL Server Management Studio。
-
当提示您连接服务器时,请在“服务器名称”中键入 (local),然后单击“连接”。
-
打开一个新查询窗口。创建一个 SQLMobile 数据库,并在该数据库中填充数据。
USE master; GO DROP Database SQLMobile; GO CREATE DATABASE SQLMobile; GO USE SQLMobile; GO CREATE TABLE MembershipData (MemberID INTEGER IDENTITY (1,1) CONSTRAINT pkMemberID PRIMARY KEY, MemberName NVarChar (50)); CREATE TABLE FlightData (MemberID INTEGER FOREIGN KEY REFERENCES MembershipData(MemberID), Destination NVarChar (50), FlightStatus NVarChar(50), ArrivalDate DATETIME, FlownMiles INTEGER); INSERT INTO MembershipData (MemberName) VALUES ('Mr Don Hall'); INSERT INTO MembershipData (MemberName) VALUES ('Mr Jon Morris'); INSERT INTO MembershipData (MemberName) VALUES ('Ms TiAnna Jones'); INSERT INTO FlightData (MemberID, Destination, FlightStatus, ArrivalDate, FlownMiles) VALUES (1, 'Seattle', 'Flight Delayed 1 hour', '8/25/00', '20000'); INSERT INTO FlightData (MemberID, Destination, FlightStatus, ArrivalDate, FlownMiles) VALUES (2, 'London', 'Flight on time', '9/12/00', '15000'); INSERT INTO FlightData (MemberID, Destination, FlightStatus, ArrivalDate, FlownMiles) VALUES (3, 'Sydney', 'Flight Gate Closing', '11/5/00', '30000'); INSERT INTO FlightData (MemberID, Destination, FlightStatus, ArrivalDate, FlownMiles) VALUES (1, 'Tokyo', 'Delayed Fog', '5/25/00', '25000'); INSERT INTO FlightData (MemberID, Destination, FlightStatus, ArrivalDate, FlownMiles) VALUES (2, 'Minneapolis', 'Flight on time', '5/1/00', '1000'); INSERT INTO FlightData (MemberID, Destination, FlightStatus, ArrivalDate, FlownMiles) VALUES (3, 'Memphis', 'Flight Gate Closing', '1/5/00', '1000');
-
单击“执行(!)”运行该脚本并创建数据库。此时,将运行该脚本,创建一个名为 SQLMobile 的新数据库。
注意: 您还可以按 F5,或者从“查询”菜单中选择“执行”来运行该查询。 -
若要确认已创建该数据库,请在对象资源管理器中,依次展开“(本地)”、“数据库”和“SQLMobile”。如果未列出该 SQLMobile 数据库,请通过右键单击“数据库”,再选择“刷新”,来更新数据库列表。
准备服务器以发布数据
在创建发布之前,必须创建快照代理用户帐户,并创建一个将在其中存储快照文件的共享文件夹,准备服务器以进行发布。创建快照文件夹之后,该文件夹将用于服务器上的所有发布。如果以前已在此服务器上创建了发布,您可以跳过这些步骤。
-
在“开始”菜单上,右键单击“我的电脑”,然后选择“管理”。
-
在“计算机管理”中,展开“系统工具”,展开“本地用户和组”,右键单击“用户”,然后选择“新用户”。
-
在“新用户”对话框中,键入以下信息,然后单击“创建”:
字段 | 值 |
---|---|
用户名 |
snapshot_agent |
密码 |
p@ssw0rd |
确认密码 |
p@ssw0rd |
用户下次登录时须更改密码 |
未选中 |
密码永不过期 |
选中 |
重要事项: |
---|
这些设置仅用于测试。在生产环境中,请确保用户帐户设置符合您的网络安全性要求。许多情况下,对于快照代理您将使用域用户帐户而不是使用本地用户帐户。 |
-
在 Windows 资源管理器中,创建一个名为“snapshot”的新文件夹。在此演练中,您可以在驱动器 C 的根目录下创建该文件夹:c:\snapshot。右键单击“快照”文件夹,选择“共享和安全”。
-
在“共享”选项卡上,选择“共享该文件夹”,然后单击“权限”。
-
在“快照的权限”中,单击“添加”。
-
在“输入要选择的对象名称”中,键入 computername\snapshot_agent(其中 computername 是您本地计算机的名称),然后单击“确定”。
-
在“快照的权限”中,选择“snapshot_agent”,分配“更改”和“读取”共享权限,然后单击“确定”。
-
选择“安全”选项卡。
-
单击“添加”。
-
在“输入要选择的对象名称”中,键入 computername\snapshot_agent(其中 computername 是您本地计算机的名称),然后单击“确定”。
-
选择“snapshot_agent”,然后将“写入”权限添加到允许的权限列表中。现在,snapshot_agent 帐户将被授予下列权限:
- 读取和运行
- 列出文件夹目录
- 读取
- 写入
- 读取和运行
-
单击“确定”关闭“快照属性”窗口。
-
关闭 Windows 资源管理器。
-
在对象资源管理器中,展开“(本地)”节点(如果当前尚未展开),然后展开“复制”。
-
右键单击“发布”文件夹,然后选择“新建发布”。
-
在新建发布向导简介屏幕上,单击“下一步”。
-
如果以前未曾在此计算机上创建发布,将提示您配置分发服务器。选择第一个选项将本地计算机作为它自己的分发服务器,然后单击“下一步”。
-
如果以前未曾在此计算机上创建发布,将提示您指定快照文件夹。键入在前面过程中创建的快照文件夹的共享路径。以 \\servername\share 格式键入共享路径,不要键入本地路径。在此演练中,我们建议您键入 \\computer\snapshot(其中 computer 是您计算机的名称),然后单击“下一步”。
-
在数据库列表中,选择“SQLMobile”,然后单击“下一步”。
-
在发布类型列表中,选择“合并发布”,然后单击“下一步”。
-
在“订阅服务器类型”页中,选择“是”启用对 SQL Server Mobile 订阅服务器的支持,然后单击“下一步”。
-
在要发布的对象列表中,选中“表”复选框。如果展开“表”,您将发现 SQLMobile 数据库中的两个表都已被选中。单击“下一步”。
-
会通知您将向表中添加唯一标识符。所有合并项目都需要一个 uniqueindentifier 列。单击“下一步”。
-
在“筛选表行”页中,现在即可添加对已发布数据的筛选器。对于此演练,您将无需筛选数据。单击“下一步”。
-
在“快照代理”页中,您可以配置创建快照的时间以及快照代理运行的频率。单击“下一步”以接受默认设置。
-
在“代理安全性”对话框中,单击“安全设置”。
- 在“快照代理安全性”对话框中,输入前面过程中所创建帐户的登录信息。进程帐户为 computer_name\snapshot_agent(其中 computer_name 是您计算机的名称),密码为 p@ssw0rd。
- 单击“确定”以保存设置。
- 在“代理安全性”页中,单击“下一步”。
- 在“快照代理安全性”对话框中,输入前面过程中所创建帐户的登录信息。进程帐户为 computer_name\snapshot_agent(其中 computer_name 是您计算机的名称),密码为 p@ssw0rd。
-
在“向导操作”屏幕上,您可以确定创建发布的时间以及是否希望创建脚本文件。单击“下一步”以接受默认选择。
-
在“完成该向导”屏幕上,键入 SQLMobile 作为发布的名称,然后单击“完成”。
-
将创建发布。向导完成后,单击“关闭”。
保护发布的安全性
若要保护发布,您必须首先向数据库安全列表中添加 IIS 匿名用户帐户,然后将该帐户添加到发布访问列表 (PAL) 中。
-
在对象资源管理器中,展开“安全性”,右键单击“登录”,然后选择“新建登录”。
-
在“新建登录”对话框中,选择“Windows 身份验证”,键入 computername\iusr_computername(其中 computername 是您计算机的名称)。
-
在导航窗格中,选择“数据库访问”窗格。
-
在数据库列表中,选择“SQLMobile”,然后单击“确定”。
-
在对象资源管理器中,展开“复制”,展开“发布”,右键单击“SQLMobile:SQLMobile”发布,然后选择“属性”。
-
在导航窗格中,选择“发布访问列表”。
-
单击“添加”。在“添加发布访问项”对话框中,列出了 IUSR 帐户。选择该帐户,然后单击“确定”。
-
请确保 IUSR 帐户当前位于 PAL 中,然后单击“确定”。
既然 SQL Server 已经配置了发布,您必须使该发布可以由 SQL Server Mobile 客户端通过网络进行访问。SQL Server Mobile 通过 IIS 连接到 SQL Server。特别是,您可以创建并配置一个虚拟目录,以允许客户端访问 SQL Server Mobile 服务器代理。
-
在 Windows 资源管理器中,导航到以下目录:
C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE
-
双击 sqlce30setupen.msi 运行安装程序。
-
在“安装”向导的简介屏幕上,单击“下一步”。
-
阅读并接受 EULA 条款,然后单击“下一步”。
-
在“系统配置检查”屏幕上,确保所有项都通过检查。如果尚未安装 SQL Server 2000,将列出该列表的最后一项作为警告。因为您正在使用 SQL Server 2005,这并不是问题。单击“下一步”。
-
在接下来的屏幕上,单击“下一步”,然后单击“安装”开始安装。
-
单击“Finish”。
-
在 SQL Server Management Studio 的对象资源管理器中,展开“(本地)”计算机节点。
-
右键单击“复制”文件夹,然后选择“配置 Web 同步”。
-
在该向导的简介屏幕上,单击“下一步”。
-
在“订阅服务器类型”屏幕上,选择“SQL Server Mobile Edition”,然后单击“下一步”。
-
在“Web 服务器”屏幕的“运行 IIS 的计算机”文本框中,键入您计算机的名称(如果尚未提供),然后单击“创建新的虚拟目录”。
-
在显示的树中,展开该计算机,展开“网站”,然后选择“默认网站”。
-
单击“下一步”。
-
在“虚拟目录信息”屏幕上的“别名”文本框中,键入 SQLMobile,然后单击“下一步”。
-
在“客户端身份验证”屏幕上,选择“客户端将以匿名方式进行连接”,然后单击“下一步”。
-
在“匿名访问”屏幕上,单击“下一步”接受默认设置。
-
在“快照共享访问”屏幕上,键入 \\computer\snapshot(其中 computer 是您计算机的名称),然后单击“下一步”。
如果收到快照共享为空的警告,请单击“是”。
-
单击“Finish”。
-
单击“关闭”。
在部署将要使用 SQL Server Mobile 的应用程序之前,预先创建 SQL Server Mobile 数据库和订阅通常会节省时间。SQL Server Management Studio 允许您在本地计算机上创建并使用 SQL Server Mobile 数据库。然后,您可以在开发应用程序时使用此数据库。
-
在 SQL Server Management Studio 的对象资源管理器中,单击“连接”,然后选择“SQL Server Mobile”。
-
在“数据库文件”字段中,选择“<新建数据库…>”。
-
在文件名文本框中,键入 c:\sqlmobile.sdf,然后单击“确定”。
-
在“连接到服务器”对话框中,单击“连接”。
将在对象资源管理器中添加名为“SQL Server Mobile [My Computer\...\sqlmobile]”的新节点。
-
在对象资源管理器中,展开“SQL Server Mobile”节点,展开“复制”,右键单击“订阅”,然后选择“新建订阅”。
-
在简介屏幕上,单击“下一步”。
-
在“选择发布”屏幕的“发布服务器”下拉列表中,选择“<查找 SQL Server 发布服务器…>”。
-
在“连接到服务器”对话框,键入或选择本地计算机,然后单击“连接”。
-
在“选择发布”屏幕的发布列表中,展开“SQLMobile”,选择“SQLMobile”发布,然后单击“下一步”。
-
在“标识订阅”屏幕上,为订阅名称键入 SQLMobile,然后单击“下一步”。
-
在“Web 服务器身份验证”屏幕上,键入前面过程中创建的虚拟目录的 URL。在此演练中,您已经创建了 URL 为 http://localhost/SQLMobile 的虚拟目录。
-
单击“订阅服务器将以匿名方式进行连接”,然后单击“下一步”。
-
在“SQL Server 身份验证”屏幕上,单击“下一步”接受默认设置。
在最终屏幕上,该向导将显示示例代码,您可以在应用程序中创建订阅时使用该代码。选择示例代码(Visual Basic 或 C#,取决于您在创建应用程序时使用的语言),然后复制代码。若要执行复制操作,请选择该代码并按 Ctrl+C。启动记事本或其他文本编辑器,然后粘贴示例代码。在使用下列步骤创建应用程序时,您将使用此代码。
-
在复制示例代码之后,单击“完成”。
-
单击“关闭”。
-
打开 Visual Studio 2005。
-
在“文件”菜单上,选择“新建项目”。
-
在“新建项目”对话框的“项目类型”树中,展开您所使用的开发语言,然后选择“智能设备”。
-
在模板列表中,选择要创建的项目类型。对于此演练,请选择“Pocket PC 2003 应用程序”。
-
为该项目提供名称和位置,然后单击“确定”。对于此演练,请将该项目命名为 SQLMobile。
Visual Studio 将创建新的项目,并显示 Form1,就像在智能设备上显示时一样。
-
在解决方案资源管理器中,右键单击“引用”,然后选择“添加引用”。
注意: 如果解决方案资源管理器中没有列出“引用”文件夹,那么单击解决方案资源管理器顶部的“显示所有文件”。 -
在 .NET 程序集列表中,选择“System.Data.SqlServerCe”,然后单击“确定”。如果没有列出 System.Data.SqlServerCe,请执行下列步骤:
- 单击“浏览”选项卡。
- 定位到以下目录:
C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
- 选择“System.Data.SqlServerCe.dll”,然后单击“确定”。
解决方案资源管理器中的引用列表现在包括 System.Data.SqlServerCe,并且您的项目可以使用该程序集。
- 单击“浏览”选项卡。
-
在解决方案资源管理器中,右键单击“Form1.cs”或“Form1.vb”,然后选择“查看代码”。
-
在窗体的代码顶部,添加指令以使用 System.Data.SqlServerCe 命名空间:
[C#]
using System.Data.SqlServerCe;
[VB]
Imports System.Data.SqlServerCe
-
在主窗口中,切换回 Form1 的“设计”(默认)视图。
-
从“数据”菜单中,单击“添加新数据源”。
注意 如果未显示“添加新数据源”,请选择 Form1 的“设计”视图,然后再次查看“数据”菜单。
-
在“选择数据源类型”窗口上,选择“数据库”,然后单击“下一步”。
-
在“选择您的数据连接”对话框中,单击“新建连接”。
-
在“选择数据源”对话框中的“数据源”下,选择“Microsoft SQL Server Mobile Edition”。在数据访问接口列表中,选择“.NET Framework Data Provider for SQL Server Mobile Edition”。单击“继续”。
-
在“添加连接”中的“数据源”下,选择“我的电脑”。
在“连接属性”部分中的“数据库”下,单击“浏览”,然后浏览到前面过程中所创建的数据库。如果按照步骤操作,该数据库位于 c:\sqlmobile.sdf。
-
单击“测试连接”,然后单击“确定”以创建新的数据连接。
-
在“选择您的数据连接”对话框中,单击“下一步”。
-
在“保存连接字符串”窗口中,单击“下一步”。
-
在“选择您的数据库对象”窗口中,选择“表”,然后单击“完成”。
-
从“数据”菜单中,选择“显示数据源”。
-
将“MembershipData”表从“数据源”窗口拖动到“Form1 设计”窗口。将在 Form1 上创建数据网格,并自动提供列名称。
-
右键单击数据网格,然后选择“属性”。
-
在“属性”窗口中,将“停靠”值更改为“顶部”。可以通过单击出现的图形表示的顶部栏,或者在值字段中键入“顶部”来完成此操作。将会对数据网格进行移动并调整其大小以填充 Form1 的顶部。
-
在数据网格的右上角,单击小箭头。从显示的菜单中,选择“生成数据窗体”。
-
将“FlightData”表从“数据源”窗口拖动到“Form1 设计”窗口。将在 Form1 上创建数据网格,并自动提供列名称。
-
您可以使用该数据网格的“属性”设置将“停靠”属性设置为“底部”。
添加代码
在应用程序的代码页中,您可以添加包含数据库文件的路径和名称的字符串变量,添加代码以便在数据库文件已存在时删除该文件,还可以添加代码以建立与 SQL Server 发布的连接、同步数据以及利用这些数据创建新的本地数据库。
-
在解决方案资源管理器中,右键单击“Form1”,然后选择“显示代码”。
-
在代码页中,找到 Form1 的类定义。添加一个字符串变量,并为其分配该 .sdf 文件的路径和名称。Visual Studio 在上文中步骤创建的数据源将该数据库文件的存储位置设为 \Program Files\ApplicationName 文件夹,其中 ApplicationName 是应用程序的名称。例如,如果您将新项目命名为 SQLMobile,您的字符串变量应设置为 "\Program Files\SQLMobile\sqlmobile.sdf"。
-
您的类定义的前几行应与以下代码类似:
[C#]
public partial class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.MainMenu mainMenu1; string filename = @"\Program Files\SSMWalkthrough\sqlmobile.sdf"; public Form1() { InitializeComponent(); }
[Visual Basic]
Public Class Form1 Dim filename As New String _ ("\Program Files\SQMWalkthrough_vb\sqlmobile.sdf")
-
创建一个新方法,以便在数据库文件存在时删除该文件。这将确保应用程序每次运行时都加载最新的数据。该方法应命名为 DeleteDB。您的代码应与以下代码类似:
[C#]
private void DeleteDB() { if (System.IO.File.Exists(filename)) { System.IO.File.Delete(filename); } }
[Visual Basic]
Sub DeleteDB() If System.IO.File.Exists(filename) Then System.IO.File.Delete(filename) End If End Sub
-
创建名为“Sync”的执行同步的新方法。若要执行此操作,您将使用从前面步骤的“新建发布向导”中复制的代码。在粘贴代码后,必须对代码执行两项更改:
- 更改 SubscriberConnectionString 值以指向在文件名变量中指定的正确路径和文件名。
- 将 AddOption 值从 ExistingDatabase 更改为 CreateDatabase。
完成后,Sync 方法应如下所示:
[C#]
private void Sync() { SqlCeReplication repl = new SqlCeReplication(); repl.InternetUrl = @"http://computer_name/sqlmobile/sqlcesa30.dll"; repl.Publisher = @"computer_name"; repl.PublisherDatabase = @"SQLMobile"; repl.PublisherSecurityMode = SecurityType.NTAuthentication; repl.Publication = @"SQLMobile"; repl.Subscriber = @"sqlmobile"; repl.SubscriberConnectionString = @"Data Source='" + filename + "';Password='';Max Database Size='128';Default Lock Escalation ='100';"; repl.AddSubscription(AddOption.CreateDatabase); repl.Synchronize(); }
Sub Sync() Dim repl As New SqlCeReplication() repl.InternetUrl = "http://computer_name/sqlmobile/sqlcesa30.dll" repl.Publisher = "computer_name" repl.PublisherDatabase = "SQLMobile" repl.PublisherSecurityMode = SecurityType.NTAuthentication repl.Publication = "SQLMobile" repl.Subscriber = "sqlmobile" repl.SubscriberConnectionString = _ "Data Source='" + filename + "';Password='';" _ & "Max Database Size='128';Default Lock Escalation ='100';" repl.AddSubscription(AddOption.CreateDatabase) repl.Synchronize() End Sub
- 更改 SubscriberConnectionString 值以指向在文件名变量中指定的正确路径和文件名。
-
最后,向调用刚才所创建两个方法的 Form1_Load 事件处理程序的开头添加代码。Form1_Load 事件处理程序应如下所示:
[C#]
private void Form1_Load(object sender, EventArgs e) { DeleteDB(); Sync(); // TODO: Delete this line of code ... this.flightDataTableAdapter.Fill(this.sqlmobileDataSet.FlightData); // TODO: Delete this line of code ... this.membershipDataTableAdapter.Fill(this.sqlmobileDataSet.MembershipData); }
[Visual Basic]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DeleteDB() Sync() 'TODO: Delete this line of code ... Me.FlightDataTableAdapter.Fill(Me.SqlmobileDataSet.FlightData) 'TODO: Delete this line of code ... Me.MembershipDataTableAdapter.Fill(Me.SqlmobileDataSet.MembershipData) End Sub
-
从“调试”菜单中,选择“开始”。
-
在“部署”对话框中,选择“Pocket PC 2003 SE 模拟器”,然后单击“部署”。
-
将会在新窗口中打开模拟器。在首次将应用程序部署到模拟器时,将安装 .NET Compact Framework 和 SQL Server Mobile。该过程可能需要几分钟的时间。当它们安装完成后,将安装您的应用程序并运行。
您的应用程序将加载并显示这两个数据网格。单击“MembershipData”数据网格中的值时,会自动更新“FlightData”数据网格中的数据。
-
关闭应用程序,在 Visual Studio 中的“调试”菜单上,单击“停止调试”。