我有一个包含三个项目的Visual Studio 2010解决方案:
所有这些项目都在同一个解决方案中,我已经将Winforms App和Service中的引用添加到类库中。在这两个项目中,我能够看到类库中的类并与它们进行交互,但我遇到了问题。我在我的类库项目的/ Resources /目录中创建了数据库(因为对我而言,“common”项目是存储公共数据库的唯一合理位置),但每当我尝试在Winforms应用程序中访问数据库时,它不会返回我知道的数据。由于System.Data.SQLite具有创建空数据库文件的默认行为(如果找不到该文件)(我认为这是一个奇怪的选择),我甚至无法返回并判断数据库是否存在。
这使我怀疑我不能正确理解一个项目中的文件是如何在另一个项目中引用的。这是我的项目的样子:
WorkModeCommon包含SQLiteDatabase和ScheduleManager类,其中ScheduleManager具有SQLiteDatabase(),SQLiteDatabase与Resources / WorkModeSchedules.s3db交互
WorkModeConfigApp和WorkModeService都有一个WorkModeCommon.ScheduleManager(),它理论上应该处理所有数据库交互。
我的设计中是否存在重大缺陷,或者有人能指出我可以帮助我解决我遇到的问题的资源?
答案 0 :(得分:1)
我认为这就是正在发生的事情
当您引用公共类库时,它只是使用.dll输出作为参考,因为它是唯一的输出。
但是,如果右键单击.s3db文件并转到其属性,则可以将其Copy to Output Directory
设置为Copy if newer
,这样数据库文件本身就位于输出目录中,因此。 DLL文件可以看到它
现在,当您的表单或服务从公共类库项目的输出目录访问.dll文件时,它也将引用.s3db文件,因此它们都会看到相同的数据。
这是否是一个好的设计取决于您的需求
如果表单和服务同时查看相同的数据,那么您必须确保它们至少查看同一个文件,而不是查看自己的.s3db文件副本。
如果它只是访问数据库的表单或服务,我可以使用它,但由于多个进程(表单和服务)正在访问它,因此公共数据库服务器是一个不错的选择。
答案 1 :(得分:1)
编译类对于引用它们的外部程序集是可见的,只要它们的可见性是公共的(有一些例外)。非编译文件是一个不同的故事。您可以将构建操作指定为“嵌入式资源”,这将允许您从引用程序集访问该文件,尽管是以只读方式。另一种选择,也可能是您想要的,是将“复制到输出目录”指定为“始终复制”或“如果更新则复制”。这将在构建时将文件复制到输出目录。
答案 2 :(得分:1)
当您开始调试WorkModeConfigApp时,应用程序从其bin \ debug目录运行,无法访问类库的资源目录。简单地引用类库并不意味着VS在Config应用程序的bin / debug中复制类库的资源目录。如果为类库设置Copy Local = true,则VS会将编译后的DLL复制到WorkModeConfigApp的bin \ debug中,但不会复制资源目录的内容
另一方面,您可以为.s3db文件设置属性copy to the output directory
,这样文件及其目录将被复制到WorkModeConfigApp的bin \ debug中。但这将成为其他问题的根源,因为在调试过程中,您的测试数据库可能会被来自类库的数据覆盖。
我认为您最好的选择是保存服务的配置文件和配置应用程序的位置以查找此文件,并且不要混淆上述属性。
我们正在谈论数据库,所以可能在App和服务的配置文件中需要添加连接字符串。您可以将所需的节点添加到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程序集)
答案 3 :(得分:0)
好的伙计们,我已经解决了我的问题。我所做的是在每个项目中包含一个DB文件的副本,并在除了其中一个实例(“Common”项目)之外的所有实例上设置“Copy To Output Directory”属性为“Do Not Copy”。之后,我将所有三个项目的输出目录更改为同一目录(更具体地说,我创建了集中的Debug和Release目录,并将正确的构建配置指向正确的目录)。我现在能够使用单个DB文件和集中式类库成功测试!