SetPropertyValue 期间的 CreateUserWizard 错误:无法连接到 SQL Server 数据库
Posted
技术标签:
【中文标题】SetPropertyValue 期间的 CreateUserWizard 错误:无法连接到 SQL Server 数据库【英文标题】:CreateUserWizard error during SetPropertyValue: Unable to connect to SQL Server database 【发布时间】:2014-04-19 16:16:35 【问题描述】:我有一个 ASP.NET 应用程序,它通常可以连接数据库,可以使用 CreateUserWizard 创建用户,但开始使用配置文件时我在用户配置文件更新期间遇到了以下异常:
[SqlException (0x80131904): 用户 'My-PC\User' 登录失败。] [HttpException (0x80004005): 无法连接到 SQL Server 数据库。]
我确定以下项目:
-
连接字符串正常,应用可以访问数据库
如果我不想想要更新他们的个人资料,用户是使用数据库中的 CreateUserWizard 创建的,没有错误
只有当我想打电话给this.SetPropertyValue("FirstName", value);
时,一切都会出错并显示以下错误:
SQLExpress 数据库文件自动创建错误:
连接字符串使用应用程序 App_Data 目录中的数据库位置指定本地 Sql Server Express 实例。提供者试图自动创建应用程序服务数据库,因为提供者确定该数据库不存在。要成功检查应用服务数据库是否存在并自动创建应用服务数据库,必须满足以下配置要求:
如果应用程序在 Windows 7 或 Windows Server 2008R2 上运行,则需要特殊的配置步骤来启用提供程序数据库的自动创建。更多信息请访问:http://go.microsoft.com/fwlink/?LinkId=160102。如果应用程序的 App_Data 目录尚不存在,则 Web 服务器帐户必须具有对应用程序目录的读写权限。这是必要的,因为如果 App_Data 目录不存在,Web 服务器帐户将自动创建它。
如果应用程序的 App_Data 目录已存在,则 Web 服务器帐户只需要对应用程序的 App_Data 目录具有读写权限。这是必要的,因为 Web 服务器帐户将尝试验证 Sql Server Express 数据库是否已存在于应用程序的 App_Data 目录中。从 Web 服务器帐户撤消对 App_Data 目录的读取访问权限将阻止提供程序正确确定 Sql Server Express 数据库是否已经存在。当提供程序尝试创建现有数据库的副本时,这将导致错误。需要写入权限,因为在创建新数据库时会使用 Web 服务器帐户的凭据。
Sql Server Express 必须安装在机器上。 Web 服务器帐户的进程标识必须具有本地用户配置文件。有关如何为计算机和域帐户创建本地用户配置文件的详细信息,请参阅自述文件。
这里是web.config
:
<configuration>
<connectionStrings>
<add name="MUQ_SMSConnectionString"
connectionString="Data Source=MY-PC\SQLEXPRESS12SP1;Initial Catalog=MyDB;"
providerName="System.Data.SqlClient;Integrated Security=True"/>
</connectionStrings>
............
</configuration>
这是个人资料更新方法:
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
ProfileCommon userProfile = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, true);
userProfile.FirstName = textBoxFirstName.Text.Trim();
userProfile.LastName = textBoxLastName.Text.Trim();
userProfile.MobileNumber = textBoxUserName.Text.Trim();
if (radioButtonMaleGender.Checked == true)
userProfile.Gender = MALE_GENDER_TAG;
else if (radioButtonFemaleGender.Checked == true)
userProfile.Gender = FEMALE_GENDER_TAG;
else
userProfile.Gender = UNKNOW_GENDER_TAG;
userProfile.Save();
这是配置文件的定义和默认提供者的覆盖:
<membership defaultProvider="mysqlProvider" >
<providers>
<add name="MySqlProvider"
type="System.Web.Security.SqlMembershipProvider"
applicationName="/"
connectionStringName="MUQ_SMSConnectionString"
requiresUniqueEmail="False"
requiresQuestionAndAnswer="false" />
</providers>
</membership>
<anonymousIdentification enabled="true" />
<profile enabled="true">
<properties>
<add name="MobileNumber" type="string" allowAnonymous="true"/>
<add name="FirstName" type="string" allowAnonymous="true"/>
<add name="LastName" type="string" allowAnonymous="true"/>
<add name="Gender" type="string" allowAnonymous="true"/>
</properties>
</profile>
<roleManager enabled="true"/>
注意:我有另一个问题,我怀疑它可能与此错误有关。当我想在应用程序的管理面板中编辑应用程序的安全选项时,SQL Server 崩溃并报告窗口中的错误。
目前我在 Windows 8.1 上使用 SQL Server 2012SP1 Express。我有 SQL Server 2008 R2 Express,然后安装了 2012 Express,但没有任何改变。
【问题讨论】:
但是你的例外说明了一切。检查数据库中的用户。 Integrated Security=True 在 web.config 中连接字符串键的 providerName 属性中做了什么?它应该在 connectionString 参数中。 【参考方案1】:当您使用 AspDotNetProfile 提供程序而不在 web.config 文件中提供提供程序配置时,您使用的是 machine.config 文件中的提供程序配置。以下是随 .NET 4.0 分发的默认 machine.config 文件的示例:
<profile>
<providers>
<add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
此定义中引用的连接字符串也可以在 machine.config 中找到:
<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
从您的问题看来,您没有覆盖 web.config 中的默认配置文件定义。因此,配置文件提供程序正在本地计算机上寻找名为 SQLEXPRESS 的 SQL Server Express 实例。原因必须是 Express 实例,因为用户实例(请参阅 AttachDBFilename 的文档)仅在 Express 版本上受支持。
所以,您有两个选择: 1. 覆盖默认的提供者配置。这可以通过删除默认配置并重新添加具有相同名称的配置来完成。 2. 在您的 Web 服务器上使用默认实例名称设置 SQL Server Express 实例。
【讨论】:
我确实更新了这个问题。我确实在我的 web.config 中覆盖了 DefaultProvider 。此外,我没有在 Web 服务器上部署代码,而是在 Visual Studio 的内置 Web 服务器上对其进行了测试。所以我“认为”我应用了你建议的两种解决方案。如果您可以查看提供程序配置,我将不胜感激。 您已经覆盖了会员提供者,但没有覆盖个人资料提供者。使用与 profile 元素上的 members 元素相同的语法,只是提供者类型不同。 它有帮助:) 我在你的答案中添加了覆盖 sn-p。正如您注意到的问题是我也错过了覆盖配置文件提供程序。以上是关于SetPropertyValue 期间的 CreateUserWizard 错误:无法连接到 SQL Server 数据库的主要内容,如果未能解决你的问题,请参考以下文章