asp.net WinForm 两份mdf文件问题的解决

在项目中用程序中嵌入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(@"bindebug")
                || datadir.endswith(@"binrelease"))
            {
                datadir = system.io.directory.getparent(datadir).parent.parent.fullname;
                appdomain.currentdomain.setdata("datadirectory", datadir);
            }

原理简单分析:连接字符串中的datadirectory的值就是通过appdomain.currentdomain.setdata赋值过去的,如果当前程序的目录以"bindebug"或者"binrelease"则认为它是运行在visualstudio环境中,就取项目的目录然后赋值给datadirectory这个key。既然是currentdomain.setdata,估计对于非默认appdomain中的数据库连接代码可能会不起作用(只是猜测,没验证),这就要需要创建子appdomain的时候再去赋值了。

上面的代码还是有一点潜在的bug的,比如正式的运行的时候exe被很杯具的放到了某个bindebug目录下,就会有问题,不过想想正式生产环境运行的时候肯定不会用这种attachdbfilename方式,这种方式只存在于开发环境,因此也就睁一只眼闭一只眼了

时间: 2024-09-22 01:13:11

asp.net WinForm 两份mdf文件问题的解决的相关文章

winform 写入 MDF文件问题 急!

问题描述 我在winform里用textbox得到数据向mdf表中输入数据,但是得到的结果让我费解代码如下using(SqlConnectionconn=newSqlConnection(@"DataSource=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;IntegratedSecurity=True;UserInstance=True")){conn.Open();using(SqlCommandsqlCmd=

如何恢复和修复MS SQL数据库的MDF文件

恢复|数据|数据库 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件,就可以了. 或者在查询分析器中输入: sp_attach_db "数据库名称","路径\文件名.ldf","路径\文件名.MDF" SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf

如何恢复/修复MSSQL数据库的MDF文件

如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件,就可以了. 或者在查询分析器中输入: sp_attach_db "数据库名称","路径\文件名.ldf","路径\文件名.MDF" SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式.下面将主要讨

如何恢复和修复SQL Server的MDF文件

  如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件,就可以了. 或者在查询分析器中输入: sp_attach_db "数据库名称","路径文件名.ldf","路径文件名.MDF" SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式.下面将主要讨

asp.net winform如何调用jar包

问题描述 asp.net winform如何调用jar包 asp.net winform如何调用jar包?或者这个jar包能转换成一个dll吗或者webservice? 解决方案 安装jre环境 Process.Start("java", "-jar 你的jar文件") 解决方案二: jre我已经安装了,这句代码写在哪里? 解决方案三: jre我已经安装了,这句代码写在哪里? 解决方案四: http://www.shaoqun.com/a/24140.aspx

ASP跨服务器上传文件完美解决

服务器|解决|上传 如果你有两个空间,一个大而慢,另外一个小而快,或者其中一个不支持FSO,那么跨服务器上传文件这个问题就摆在你面前了,下面就是我在解决ylog.net里面的跨服务器上传文件的日记,这个问题看似简单,里面的细节问题却是非常有趣 前提条件,空间都必须支持ASP,上传文件的服务器支持FSO,下面的叙述中,diygame.com为存上传文件的服务器,ylog.net为网站服务器,即显示用户界面的服务器... 实现功能,文件上传,上传后在网页的文本区域自动加上对于图片的UBB码,为了清楚

通过asp入侵web server,窃取文件毁坏系统-ASP漏洞集

server|web    本文主要叙及有关ASP/iis的安全性问题及其相应对策,不提倡网友使用本文提及的方法进行任何破坏,否则带来的后果自负通过asp入侵Web server,窃取文件毁坏系统,  这决非耸人听闻...   iis的安全性问题   1.iis3/pws的漏洞   我实验过,win95+pws上运行ASP程序,只须在浏览器地 址栏内多加一个小数点ASP程序就会被下载下来.IIS3听说也有同样的问题,不过我没有试出来.   2.iis4的漏洞   iis4一个广为人知的漏洞是::

ASP.NET 2.0 多文件上传小经验

asp.net|上传     想实现任意多个文件上传的功能,点击一次按钮可以添加一个文件上传框,以前在网络硬盘上看到过.JavaScript我知道怎么实现任意添加上传文件控件,问题是添加的是Html控件,我不懂怎么让服务器端可以获取文件.     于是上google搜索"ASP.NET 多文件上传",还真找到一篇文件,标题为<在ASP.NET中实现多文件上传>,文章里面是VB.NET实现的,功能和我要的一模一样,我主要是要看服务器端怎么获取客户端上传的文件,看了文中的代码,

没有日志,只有MDF文件如何恢复数据库

恢复|数据|数据库 由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了. 如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,但是会出现类似下面的提示信息 设备激活错误.物理文件名 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' 可能有误. 已创建名为 'C:\Program Files