Ошибка CreateUserWizard во время SetPropertyValue: невозможно подключиться к базе данных SQL Server

У меня есть приложение ASP.NET, которое обычно может подключаться к базе данных, может создавать пользователей с помощью CreateUserWizard, но начиная с профилей, я придерживался ниже исключения во время обновления профиля пользователя:

[SqlException (0x80131904): Ошибка входа для пользователя "Мой ПК \ Пользователь".]
[HttpException (0x80004005): невозможно подключиться к базе данных SQL Server.]

Я уверен в следующих пунктах:

  1. Строка подключения в порядке, и приложение может получить доступ к БД
  2. Пользователь создается с помощью CreateUserWizard в базе данных без ошибок, если я не хочу обновлять его профиль

Только когда хочу позвонить this.SetPropertyValue("FirstName", value); все идет не так, как показано ниже:

Ошибка автоматического создания файла базы данных SQLExpress:

Строка подключения указывает локальный экземпляр Sql Server Express с использованием расположения базы данных в каталоге приложения App_Data. Поставщик попытался автоматически создать базу данных служб приложений, поскольку поставщик определил, что база данных не существует. Следующие требования к конфигурации необходимы для успешной проверки существования базы данных служб приложений и автоматического создания базы данных служб приложений:

Если приложение работает в Windows 7 или Windows Server 2008R2, необходимо выполнить специальные шаги по настройке, чтобы включить автоматическое создание базы данных поставщика. Дополнительная информация доступна по адресу: http://go.microsoft.com/fwlink/?LinkId=160102. Если каталог App_Data приложения еще не существует, учетная запись веб-сервера должна иметь права на чтение и запись в каталог приложения. Это необходимо, поскольку учетная запись веб-сервера автоматически создаст каталог App_Data, если он еще не существует.

Если каталог App_Data приложения уже существует, учетной записи веб-сервера требуется только доступ на чтение и запись к каталогу приложения App_Data. Это необходимо, поскольку учетная запись веб-сервера будет пытаться проверить, что база данных Sql Server Express уже существует в каталоге App_Data приложения. Отмена доступа для чтения в каталоге App_Data из учетной записи веб-сервера не позволит провайдеру правильно определить, существует ли база данных Sql Server Express. Это приведет к ошибке, когда провайдер попытается создать дубликат уже существующей базы данных. Доступ на запись необходим, поскольку учетные данные учетной записи веб-сервера используются при создании новой базы данных.

Sql Server Express должен быть установлен на машине.
Идентификатор процесса для учетной записи веб-сервера должен иметь локальный профиль пользователя. См. Документ readme для получения подробной информации о том, как создать локальный профиль пользователя для учетных записей компьютера и домена.

Вот 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.

В настоящее время я использую SQL Server 2012SP1 Express в Windows 8.1. Я имел SQL Server 2008 R2 Express, а затем установил 2012 Express, но ничего не изменилось.

1 ответ

Решение

Когда вы используете провайдера AspDotNetProfile без предоставления конфигурации провайдера в своем файле web.config, вы используете конфигурацию провайдера в своем файле machine.config. Вот пример из файла machine.config по умолчанию, распространяемого с.NET 4.0:

    <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. Таким образом, происходит то, что поставщик профилей ищет экземпляр SQL Server Express с именем SQLEXPRESS на локальном компьютере. Причина должна быть в экземпляре Express, потому что экземпляры пользователя (см. Документацию для AttachDBFilename) поддерживаются только в Express Edition.

Итак, у вас есть два варианта: 1. Переопределить конфигурацию поставщика по умолчанию. это можно сделать, удалив конфигурацию по умолчанию и повторно добавив конфигурацию с тем же именем. 2. Настройте экземпляр SQL Server Express с именем экземпляра по умолчанию на веб-сервере.

Другие вопросы по тегам