博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】在控制台、WinForm项目中的嵌入mdf文件的烦恼
阅读量:6275 次
发布时间:2019-06-22

本文共 1695 字,大约阅读时间需要 5 分钟。

ASP.net开发web应用,asp.net 2.0特有几个特殊的文件夹App_Data,web应用的数据库大可以放在这个下面,一直工作的很好。......知道有一天开始写控制台、WinForm的程序,^_^,当然也想享受这种方便啦,可是发现Windows应用项目中不支持特殊的文件夹,根本没有这种东西!

在ASP.net程序中只要将mdf文件放到项目的App_Data文件夹即可,在连接字符串中使用 Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\数据库名称.mdf;Integrated Security=True;User Instance=True       做连接字符串即可。

在配置文件中连接字符串
<
connectionStrings
>
<
add name
=
"
ConnectionString
"
connectionString
=
"
data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|data.mdf;User Instance=true
"
providerName
=
"
System.Data.SqlClient
"
/>
</
connectionStrings
>

 

而WinForm中的DataDirectory值则是当前项目的路径,因此Winform中mdf文件不用放到App_Data中,放到项目根目录下就可以。但是新问题随之又来了,WinForm程序运行的时候连接的是bin/Debug下的mdf文件,而不是项目中的mdf文件,这是和ASP.net程序行为不同的地方。每次程序发生Build行为的时候,项目中的mdf就会覆盖bing/Debug下的mdf文件,也就是有两个mdf文件的存在,项目中的mdf相当于“源文件”。虽然可以通过修改文件的“BuildToOuput”属性来部分解决问题,但是仍然不是很完美。

有一个比较很直接的想法,就是让程序去连接项目中的mdf文件,而不是连接bin/Debug下那个。 经过查询资料找到了修改方法,在Program.cs文件 Main函数 最开始加入如下代码: string dataDir = AppDomain.CurrentDomain.BaseDirectory;             if (dataDir.EndsWith(@"\bin\Debug\")                 || dataDir.EndsWith(@"\bin\Release\"))             {

                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;                 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);             }
原理简单分析:连接字符串中的DataDirectory的值就是通过AppDomain.CurrentDomain.SetData赋值过去的,如果当前程序的目录以"\bin\Debug\"或者"\bin\Release\"则认为它是运行在VisualStudio环境中,就取项目的目录然后赋值给DataDirectory这个key。既然是CurrentDomain.SetData,估计对于非默认AppDomain中的数据库连接代码可能会不起作用(只是猜测,没验证),这就要需要创建子AppDomain的时候再去赋值了。
上面的代码还是有一点潜在的bug的,比如正式的运行的时候exe被很杯具的放到了某个bin\Debug目录下,就会有问题,不过想想正式生产环境运行的时候肯定不会用这种AttachDbFilename方式,这种方式只存在于开发环境,因此也就睁一只眼闭一只眼了

参考:       

 
分类:

转载于:https://www.cnblogs.com/lzhitian/archive/2012/06/06/2537805.html

你可能感兴趣的文章
从服务器下载一个离线包,格式为gz的压缩包,怎么解压呢。
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>
基于Internet的软件工程策略
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
PyCairo指南--目录
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>