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 数据库的主要内容,如果未能解决你的问题,请参考以下文章

当实体未更改时,Hibernate 在刷新期间保持实体

在 INSERT SELECT 语句期间生成增量数值列值

如何知道 Open Office Java API 中的属性值

sh Crea nuovo虚拟主机

html Crea unburgermenùanimato

css Crea联合菜单水平