博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm程序中两份mdf文件问题的解决
阅读量:4180 次
发布时间:2019-05-26

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

在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给学生,学生也不用将数据库文件attach。采用项目中嵌入mdf文件的方式,老师把讲课的代码发给学生,学生打开就可以运行。我在教学中就是用的这种方式进行讲解。

在ASP.net程序中只要将mdf文件放到项目的App_Data文件夹即可,在连接字符串中使用
Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/CallCenter.mdf;Integrated Security=True;User Instance=True
做连接字符串即可。
但是在WinForm程序中,如果在项目的App_Data文件夹中新建一个mdf文件,然后用
Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/CallCenter.mdf;Integrated Security=True;User Instance=True
进行连接会提示找不到CallCenter.mdf。原来WinForm程序并不会去App_Data中找mdf文件。原来在ASP.net中DataDirectory的值是当前项目的App_Data路径,而WinForm中的DataDirectory值则是当前项目的路径,因此Winform中mdf文件不用放到App_Data中,放到项目根目录下就可以。
但是新问题随之又来了,在WinForm中用这种方式开发的时候有时候改了项目中mdf文件中的表中的数据或者表结构,运行的时候却发现运行时通过程序读取的数据或者表结构没有变,而有时调试时Insert插入的数据在这次调试的时候竟然没有了。经过研究发现,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方式,这种方式只存在于开发环境,因此也就睁一只眼闭一只眼了,呵呵。
参考资料:

 

 

转载地址:http://syhai.baihongyu.com/

你可能感兴趣的文章
AAC的ADTS头文件信息介绍
查看>>
CMAKE手册
查看>>
Doubango RTP包传输使用UDT可靠传输协议,解决RTP丢包问题
查看>>
Android手机H264软编码参数优化
查看>>
将AAC格式的RTP流存储为可以播放的m4a文件
查看>>
UDT协议-基于UDP的可靠数据传输协议
查看>>
[FFMPEG硬件加速]nvidia方案
查看>>
openal播放裸数据
查看>>
OpenAL对象属性
查看>>
OpenAL 3D效果营造
查看>>
librtmp协议分析---RTMP_SendPacket函数
查看>>
视频学习笔记:Android ffmpeg解码多路h264视频并显示
查看>>
关于对H264码流的TS的封装的相关代码实现
查看>>
PortAudio+webrtc+lame实现采集降噪增益mp3
查看>>
视频压缩编码和音频压缩编码的基本原理
查看>>
利用FFmpeg玩转Android视频录制与压缩(二)
查看>>
利用FFmpeg玩转Android视频录制与压缩(三)
查看>>
windows10 编译x264出现 undefined reference to `_beginthreadex'解决
查看>>
使用vs2013或vs2015 编译ffmpeg
查看>>
win10 msys2 vs2015 ffmpeg3.3.3 编译 带x264 aac
查看>>