Web.config或App.config中数据库链接路径的问题
以前做ASP.net WEB开发时Web.config中数据库链接都是配置链接到服务器的SQL SERVER上的,也做过几个小的项目是用SQLite数据库文件内置的。现在在做一个Winform的项目,也用SQLite数据库文件内置,在配置App.config时完全按Web用SQlite时的配置方法。后面出现了保存数据到数据库时,报“No such table”的错误信息,后经检查原因是数据库没有连接上。把App.config数据库连接语句<connectionStrings>
<clear/>
<add name="SQLiteDbConnection" connectionString="Data Source=|DataDirectory|Calculation.db;Version=3;BinaryGUID=False" providerName="System.Data.SQLite"/>
</connectionStrings>中的“|DataDirectory|Calculation.db”改为完全绝对路径(E:\开发项目\演算器项目\Calculation\App_Data\Calculation.db)后,问题解决了。但是考虑到项目的移植性,不可能用绝对路径的。后下面就找动态相对路径的方法,看了好多资料后发现Windows应用项目中不支持特殊的文件夹App_Data。但是为了方便或习惯,还是想用。于是自己建,还叫App_Data。运行发现数据库连不上,从错误信息中来看,原来Winform把|DataDirectory|解析到了程序启动目录apppath\bin\debug(或release),后面不带App_Data!而WEB中|DataDirectory|是解析到目录程序的App_Data文件夹下的。折腾了半天终于搞明白原因了。那我在apppath\bin\debug文件夹下建立App_Data文件夹,在里面放置数据库文件。这样的话一切OK但是后面发现数据保存不成功,最后在网上找了一个方法问题总算解决了。方法如下:
- string p = AppDomain.CurrentDomain.BaseDirectory;
- if (p.IndexOf("\\bin\\") > 0)
- {
- if (p.EndsWith("\\bin\\Debug\\"))
- p = p.Replace("\\bin\\Debug", "");
- if (p.EndsWith("\\bin\\Release\\"))
- p = p.Replace("\\bin\\Release", "");
- }
- if (!p.EndsWith("App_Data\\"))
- p = p + "App_Data\\";
- AppDomain.CurrentDomain.SetData("DataDirectory", p);
思想就是去掉调试期间和生产期间的不同,这样要注意的是,发布程序的时候,数据库也要放到App_Data目录下面。