前言
近日,在使用C#连接数据库的时候,对数据库中的表做更新后,在当前启动项目中去显示表数据时虽然会发生一个更新,但是在结束程序运行后再去观察数据表中的记录时发现并没有发生一个变化,在重复尝试了好几次后还是同样的结果,于是就开始了我的查错之旅~
现象观察
现在的场景是对一个学生信息去做一个增删查改
- 下面是原数据表Student中的记录
- 然后我点击【增加】按钮后会弹出框让用户输入需要添加的学生信息
- 当操作后再去点击【显示表数据】后,就可以发现当前数据表中已经多出了一条记录
- 然后我在结束程序后去查看Student数据表的时候发现并数据表中的记录并没有做一个同步的更新,再想可能要手动刷新一下才行,于是点击了左上角的【刷新】后发现依旧是这幅模样,还是和之前一样的9条记录,这是为什么呢???我便感觉到很疑惑
想到可能是出了BUG吧,于是又开启程序进行操作~
- 但是当我先点击【显示表数据】想要查看一下数据表中的信息时,却发现程序运行起来是做了更新的,但是数据表中却没有做更新,导致了两边不同步的情况,这就让我百思不得其解(・∀・(・∀・(・∀・*)
问题思考
于是我就开始思考🤔既然两边的数据都不一致的话,那么这会不会就是就是两张数据表呢👈
- 经过我不断地搜寻资料、询问老师和同学、查看各种博客下,终于验证了我的猜测!!!
- 这真的是两张不同的数据表,当我们去运行程序的时候,默认是在DeBug环境底下去进行的,所以我们连接到的是
bin\Debug
下的数据库文件,而不是项目根目录下的数据库文件
- 也就是说我们在运行程序的时候,其实一直在更改
bin\Debug
文件下的数据库文件,所以在下一次运行起来后所查询的也是这个数据库,而根目录下的Database.mdf
数据库文件却一直没有被动过,所以没更新是正常的
解决问题
接下去我们就来解决一下这个问题
- 步骤很简单,只需要设置一下当前你工程下的
.mdf
结尾的数据库文件属性即可
- 对于复制到输出目录这个属性的默认值为【始终复制】,我们将其改为【不复制】即可
- 还有一点,有的同学可能会遇到下面这样的情况,如果你设置的属性值为【如果较新则复制】,此时在运行程序后就会出现如下的情况,出现
正由另一进程使用,因此该进程无法访问此文件
,然后项目被不断地重启,不过最多不会超过10次 - 这就是因为你正在运行
bin\DeBug
目录下的【.mdf】数据库文件,此时发现两边的数据库信息不一致,编译器就会选择去做一个更新,那么机会和根目录下的【.mdf】文件冲突了,两个进程所使用的端口号是一直的, 这类似于我们在启动Tomcat服务器出现端口号占用的情况
- 还有一点就是你一定要保证你的数据库连接字符串所寻找的数据库文件
[Database1.mdf]
是正确的
// 创建一个数据库连接字符串 string connectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=D:\\code\\c-sharp\\实验\\实验4\\学生成绩增删查改\\学生成绩增删查改\\Database1.mdf;Integrated Security=True";
- 接下去我们再运行程序进行数据表的修改时就发现数据库中的学生表发生了同步的更新👈