LocalDB 在 ASP.NET 程序中找不到数据库:有时候错误信息是:无法找到数据库,请确认数据库名称是否正确;而有时候会变成:Cannot open database requested by the login. The login failed.
其实第一个错误信息有时候是身份验证的问题导致的,如果真是数据库名称没写对,而苦苦地寻找解决方案,那就真的可以去撞墙了。
我出现这个问题的情况特别诡异,而这是我第一次接触 SqlServer,对其不大了解,导致了我花了很多时间才解决了这个问题。
首先,我在本机跑的时候是完全没问题的,可是当我部署到服务器上跑就出现了找不到数据库的问题了。
数据库以及表我都是写成控制台程序,以可执行程序的形式跑的,程序跑得很顺利,可是运行 ASP.NET 程序的时候却出错了。
于是我又写了一个测试连接数据库的控制台程序,结果跑得也是很顺利。这时候就纳闷了,百度出了各种解决方案,再次吐槽:国内的很多文章都特么是一字不落抄过去的,而 StackOverflow 也有很多解决方案,试了很多种方法,结果都是在几个错误信息中来回变动。
后来,我逐渐感觉是身份验证的原因,于是到微软官网查看了一下 SqlConnection.ConnectionString 的文档,想要看看如何在连接字符串中添加用户名密码,这两个参数没找到,我却先看到了“Initial Catalog- 或 -Database”参数,于是,我就把数据库参数添加到连接字符串中。
(原本我是先连接到 LocalDB 实例,再调用 ChangeDatabase 方法切换数据库的,于是每次在这个方法都报错:找不到数据库)
很令人惊喜的是,这次的错误信息不再是过去那几个中的一个了:Cannot open database requested by the login. The login failed.
很明确的,身份验证的原因。
百度一下,链接到 StackOverflow,看到了很多个熟悉的解决方案,而且解决率还很高,但对于我来说并没有解决成功,而且也看到了类似的解决方案,吐槽:跟国内差不多,拿别人的解决方案,稍微换一下,又是原创解决方案了,呵呵哒。
对于我的问题,正确的解决方案是倒数第三个:
I had this problem and what solved it for me was to:
- Go to the Application pools in the IIS
- Right click on my project application pool
- In Process Model section open Identity
- Choose Custom account option
- Enter your pc user name and password.
就是到服务器中的 IIS 找到应用程序所在的应用程序池,点击右边的高级设置(他上面说是右键,额。。。不知道是哪个版本的 IIS 是酱紫操作的,我的是 IIS7),然后设置“进程模型”的“标识”属性,弹出对话框后选择自定义账户,输入你登录服务器的账号密码,OK。
在这里就不截图了,不方便,233333
问题解决后,我突然恍然大悟,为什么控制台程序能跑得很顺利,而 ASP.NET 程序却报错?因为控制台程序不需要去设置程序的身份,默认使用登录系统的账户,而 ASP.NET 是托管在 IIS 中的,有涉及到身份验证,默认值为 ApplicationPoolIdentify,不懂这是什么,可是它导致了错误,就说明这个身份肯定不行。
以上。