1

我有一个包含三个项目的 Visual Studio 2010 解决方案:

  • 一个 Windows 服务,它将从 SQLite 数据库中读取数据以执行操作
  • 一个 Winforms 应用程序,它将提供一种配置服务行为的方法(通过更新 SQLite 数据库)
  • 一个类库项目,用于将所有数据库访问从服务和配置应用程序中抽象出来(使将来更容易更新与数据库有关的任何内容,而无需在其他两个项目中查找查询)

所有这些项目都在同一个解决方案中,并且我已将 Winforms 应用程序和服务的引用添加到类库中。在这两个项目中,我都能够看到类库中的类并与它们进行交互,但我遇到了问题。我已经在我的类库项目的 /Resources/ 目录中创建了数据库(因为对我来说“公共”项目是存储公共数据库的唯一明智的地方),但是每当我尝试在 Winforms 应用程序中访问数据库时,它没有返回我知道的数据。由于 System.Data.SQLite 具有在未找到文件时创建空数据库文件的默认行为(我认为这是一个奇怪的选择),因此我什至无法返回并判断数据库是否存在。

这让我怀疑我没有正确理解一个项目中的文件是如何在另一个项目中引用的。这是我的项目的样子:

VS 中解决方案管理器的屏幕截图

WorkModeCommon 包含类 SQLiteDatabase 和 ScheduleManager,其中 ScheduleManager 有一个 SQLiteDatabase() 并且 SQLiteDatabase 与 Resources/WorkModeSchedules.s3db 交互

WorkModeConfigApp 和 WorkModeService 都有一个 WorkModeCommon.ScheduleManager(),理论上它应该负责所有的数据库交互。

我的设计是否存在重大缺陷,或者有人可以向我指出可以帮助我解决我遇到的问题的资源吗?

4

4 回答 4

1

当您开始调试 WorkModeConfigApp 时,应用程序从其 bin\debug 目录运行,无法访问类库的资源目录。简单地引用类库并不意味着 VS 将类库的资源目录复制到 Config 应用的 bin/debug 中。如果为类库设置 Copy Local = true ,VS 将在 WorkModeConfigApp 的 bin\debug 中复制已编译的 DLL,但不会复制资源目录的内容

另一方面,您可以copy to the output directory为 .s3db 文件设置属性,这样文件及其目录将被复制到 WorkModeConfigApp 的 bin\debug 中。但这将是其他问题的根源,因为在调试期间,您的测试数据库有可能被来自类库的数据库覆盖。

我认为您最好的选择是将服务和配置应用程序的配置文件保存在该文件的位置,并且不要弄乱上述属性。

我们正在谈论一个数据库,所以可能在应用程序和服务的配置文件中,您需要添加一个连接字符串。您可以将所需的节点添加到您的 App.config,请参见下面的示例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="WindowsFormsApplication1.Properties.Settings.MyDatabaseConnection"
            connectionString="Data Source=C:\ProgramData\MyAppName\/WorkModeSchedules.s3db;Version=3;Pooling=True;Max Pool Size=100;"/>
    </connectionStrings>
</configuration> 

然后,您可以使用以下方法之一访问此值:

string cnnString1 = ConfigurationManager.ConnectionStrings["MyDatabaseConnection"];
string cnnString2 = Properties.Settings.Default.MyDatabaseConnection;

(ConfigurationManager 方法需要引用 System.Configuration 程序集)

于 2012-05-24T20:17:44.763 回答
1

我认为这就是正在发生的事情。
当您引用公共类库时,它只是使用 .dll 输出作为引用,因为它是唯一的输出。
但是,如果您右键单击 .s3db 文件并转到其属性,则可以将其Copy to Output Directory设置为Copy if newer,这样数据库文件本身就在输出目录中,因此 .dll 文件可以看到它。
现在,当您的表单或服务从公共类库项目的输出目录访问 .dll 文件时,它也会引用 .s3db 文件,因此它们都会看到相同的数据。

这是否是一个好的设计取决于您的需求。
如果表单和服务同时查看相同的数据,那么您必须确保它们至少查看的是同一个文件,而不是它们自己的 .s3db 文件副本。
如果只是表单或服务访问数据库,我可以接受,但由于多个进程(表单和服务)正在访问它,因此通用数据库服务器是一个不错的选择。

于 2012-05-24T20:09:34.170 回答
1

编译的类对引用它们的外部程序集是可见的,只要它们的可见性是公共的(有一些例外)。非编译文件是另一回事。您可以将构建操作指定为“嵌入式资源”,这将允许您从引用程序集访问文件,尽管是以只读方式。另一个选项(可能是您想要的)是将“复制到输出目录”指定为“始终复制”或“如果更新则复制”。这将在构建时将文件复制到输出目录。

于 2012-05-24T20:13:21.957 回答
0

好的,伙计们,我已经解决了我的问题。我所做的是在每个项目中包含数据库文件的副本,并将除一个实例(“通用”项目)之外的所有实例(“通用”项目)上的“复制到输出目录”属性设置为“不复制”。之后,我将所有三个项目的输出目录更改为同一个目录(更具体地说,我创建了集中的 Debug 和 Release 目录,并将正确的构建配置指向正确的目录)。我现在能够使用单个 DB 文件和集中式类库成功测试!

于 2012-07-24T18:59:51.103 回答