我正在部署使用vs 2008 0n XP sp3构建的winform应用程序。
我创建了一个带有空架构的数据库,我将其放在项目的根文件夹和我选择的属性中Build Action
:嵌入式资源和Copy to Output directory
:始终复制。现在,我没有在app.config connectionString部分中使用connectionstring,而是在appSetting
中添加了一个条目:key
=“database”; value
=“mydb.db; Version = 3”。
所以要创建我使用的connectionString
:
SQLiteConnection con = new SQLiteConnection("Data Source=" + Path.Combine(Application.StartupPath, ConfigurationManager.AppSettings["database"]));
一切正常,我用安装项目打包应用程序。现在安装应用程序后无法找到数据库,我不得不将数据库复制到安装项目中的Application Folder
工作。
我认为db应该是因为copy always
而在应用程序dll中。但我无法访问它。那究竟我做错了什么?
我怀疑我应该刚刚连接到root db,意思是不使用Application.StartupPath
但我在这里要求最佳实践,因为我所做的工作仍然有效,但仍然看起来像是解决方法所以请有人可以与我分享他的经验吗? 感谢您的阅读
答案 0 :(得分:5)
Embedded Resource
表示数据库嵌入到您的dll中。在这种情况下,Copy to output directory
设置不适用于Build Action: Content
。
嵌入数据库后,您基本上必须在首次使用时取消嵌入。为此,请将其从程序集中读出并将其存储到文件中。
class EmbeddedResourceTest
{
public static void Test()
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Test.db");
using(var resourceStream = typeof(EmbeddedResourceTest).Assembly.GetManifestResourceStream("Test.db"))
{
using(var fileStream = File.OpenWrite(path))
{
CopyStream(resourceStream, fileStream);
}
}
// now access database using 'path'
}
public static void CopyStream(Stream inputStream, Stream outputStream)
{
CopyStream(inputStream, outputStream, 4096);
}
public static void CopyStream(Stream inputStream, Stream outputStream, int bufferLength)
{
var buffer = new byte[bufferLength];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, bufferLength)) > 0)
{
outputStream.Write(buffer, 0, bytesRead);
}
}
}