SetPropertyValue期间CreateUserWizard错误:无法连接到SQL Server数据库

时间:2014-04-19 16:16:36

标签: c# asp.net sql-server asp.net-profiles createuserwizard

我有一个通常可以连接数据库的ASP.NET应用程序,可以使用CreateUserWizard创建用户,但是在用户配置文件更新期间开始使用我在下面的异常中停留的配置文件:

  

[SqlException(0x80131904):用户'My-PC \ User'登录失败。]   [HttpException(0x80004005):无法连接到SQL Server数据库。]

我确定以下项目:

  1. 连接字符串正常,app可以访问db
  2. 用户是使用CreateUserWizard在数据库中创建的,如果我想要更新他们的个人资料,则没有错误
  3. 只有当我想致电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服务器帐户必须具有对应用程序目录的读写权限。这是必要的,因为如果Web服务器帐户尚不存在,它将自动创建App_Data目录。

         

    如果应用程序的App_Data目录已存在,则Web服务器帐户只需要对应用程序的App_Data目录进行读写访问。这是必要的,因为Web服务器帐户将尝试验证应用程序的App_Data目录中是否已存在Sql Server Express数据库。从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但没有任何改变。

1 个答案:

答案 0 :(得分:3)

如果在web.config文件中未提供提供程序配置的情况下使用AspDotNetProfile提供程序,则表示您正在使用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实例,因为只有Express版本支持User实例(请参阅AttachDBFilename的文档)。

所以,你有两个选择: 1.覆盖默认提供程序配置。这可以通过删除默认配置并重新添加具有相同名称的配置来完成。 2.在Web服务器上使用默认实例名称设置SQL Server Express实例。