使用 Microsoft SQL Compact 3.5 的心得体会

在最近的一个项目中,遇到了一些使用 Microsoft SQL Compact 3.5 的问题,这些问题花费了不少时间来解决。这主要是因为文档要么不够清晰,要么根本就不存在。尽管如此,SQL Compact 3.5 是一个非常适合桌面应用程序的数据库解决方案,相信它会越来越受到开发者的欢迎,不仅仅是在移动应用领域。当然,许多开发者可能会选择使用 SQL Express,这也是一个很棒的工具,但它有一些限制。首先,使用 SQL Express 安装和分发应用程序可能比使用 SQL Compact 3.5 更复杂。

数据库设计

显然,首先需要做的是开始设计 SQL Server Compact 数据库。但是,提供程序在哪里呢?这让困惑了一阵子,因为可以在 Visual Studio 2008 中创建 .sdf 文件,但它们似乎并不是 3.5 版本的数据库!嗯,需要安装设计工具!默认情况下,Visual Studio 安装过程会安装 SQL Server Compact 3.5,但它不会安装设计时工具,这些工具允许创建 3.5 版本的数据库。可以从安装盘上获取这些工具;文件名为 SSCEVSTools-enu.msi,这个文件也包含在 Visual Studio 的 Express 版本中。

SQL Compact 与LINQ

正如可能预期的那样,LINQ是支持的;这是一个巨大的话题,在这里覆盖起来非常困难,而且 Matt Sollars 已经在 CodeProject 上做了很好的工作,可以在这里阅读。不幸的是,SQL Compact 与 Visual Studio 内置的 Visual O/R Mapping 特性不兼容,所以为了生成 LINQ 所需的 .dbml 文件,SQLMetal.exe 是唯一的选择。在项目中,实际上将 SQLMetal.exe 复制到解决方案目录中,并将其添加到源代码控制中。然后,创建了一个简单的批处理文件,可以在数据库结构发生变化时运行。这样,可以确保新生成的代码类与解决方案兼容,如果处于多开发者环境中,每个人都以相同的方式生成 .dbml 文件。特定批处理文件如下所示:

SqlMetal /database:DB /Pluralize /provider:SQLCompact /code:"DB.cs" /language:csharp "DataBase\DB.sdf" /Password:dbpass1! /entitybase:AppName.DataLayer.ITable SqlMetal /database:DB /Pluralize /provider:SQLCompact /dbml:DB.dbml "DataBase\DB.sdf" /namespace:AppName.DataLayer /Password:dbpass1! SqlMetal /database:DB /provider:SQLCompact /code:"DB.cs" /map:DB.xml "DataBase\DB.sdf" /Password:dbpass1! sqlmetal /? PAUSE

需要注意的一点是,除非想要一个 XML 映射文件,否则实际上不需要创建代码文件(批处理文件第一行的 .cs 命令)。当在解决方案中包含 .dbml 文件时,Visual Studio 会自动生成类。这使得处理数据库结构的变化有点麻烦。假设向 Compact 数据库添加了一些字段或表;为了更新解决方案中的类,必须移除当前的 .dbml 文件,使用批处理文件重新创建它,然后包含新的 .dbml 文件,这将使 Visual Studio 弹出并执行其操作并创建类(在 C# 或 VB 中)。如果还在构建 XML 映射文件(以及批处理文件中所需的代码文件),请记得删除 SQLMetal 构建的 .cs 文件,否则解决方案代码中将包含重复的部分类,这将导致构建错误。

连接字符串/ CreateDatabase()

这个问题让困惑了好几天。任何开发软件的人都知道硬编码的恐怖,尤其是数据库连接字符串。在应用程序中,使用标准方法告诉应用程序数据库的位置,使用解决方案属性中的 |DataDirectory| 宏:

Data Source=|DataDirectory|\DataBase\DB.sdf;Password=dbpass1!;Persist Security Info=True

一切都很好,直到开始包含旨在保护应用程序一旦发布到野外的类。显然,一个针对桌面的断开连接的数据库应用程序需要在其中构建弹性。首先,不想随应用程序一起运送空的数据库文件;它应该足够智能,在启动时(安装后首次运行)立即创建一个,或者在随后的应用程序运行中使用现有文件。如果使用LINQ,有一个很棒的方法叫做 ... 猜对了 ... C# CreateDatabase():

AppLocation = AppDomain.CurrentDomain.BaseDirectory; DatabaseLocation = Path.Combine(AppLocation, "Database"); PathToDatabase = Path.Combine(DatabaseLocation, "DB.sdf");

将这些定义在一个单独的类中,在这里存储所有这些应用程序范围的零碎东西,以便它们在应用程序中的任何地方都易于访问。因此,在发出 DatabaseExists() 或 CreateDatabase() 方法调用之前,需要在主上下文类中构建合格的连接字符串

static DB _context; _context = new DB( "Data Source=" + ApplicationUtilities.DatabaseLocation + "\\DB.sdf;Password=dbpass1!;Persist Security Info=True" ); if (!_context.DatabaseExists()) { try { _context.CreateDatabase(); DatabaseCreated = true; log.Info("Database created successfully"); } catch (Exception ex) { throw new DBDatabaseException("Failed to Create the Database!", ex); } } else { DatabaseCreated = false; }

私有安装

使用 SQL Compact 3.5 而不是 SQL Express 的一个主要好处是它的体积非常小!1.8MB 对于一个数据库解决方案来说是非常小的,无论怎么看。与 SQL Express 的安装相比,它的体积要小得多。另一个主要(在看来)好处是最终用户的安装简便性(以及开发安装程序的简便性),因为它只是一个 XCopy 过程,将 DLL 从 MSI 或 Setup.exe 文件复制到安装文件中,然后就愉快地开始了。严格遵循了 Microsoft 进行 SQL Compact 3.5 私有安装的说明,但它没有起作用;无数次地检查了它们,但都没有成功。最终找到了解决方案 ... 需要在 app.config 文件中添加以下内容:

<system.data> <DbProviderFactories> <remove invariant="System.Data.SqlServerCe.3.5" /> <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> </DbProviderFactories> </system.data>

还没有在 Microsoft 网站上找到这些信息,它肯定不是他们关于如何进行 SQL Compact 3.5 私有安装的说明的一部分。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485