Ошибка CreateUserWizard во время SetPropertyValue: невозможно подключиться к базе данных SQL Server
У меня есть приложение ASP.NET, которое обычно может подключаться к базе данных, может создавать пользователей с помощью CreateUserWizard, но начиная с профилей, я придерживался ниже исключения во время обновления профиля пользователя:
[SqlException (0x80131904): Ошибка входа для пользователя "Мой ПК \ Пользователь".]
[HttpException (0x80004005): невозможно подключиться к базе данных SQL Server.]
Я уверен в следующих пунктах:
- Строка подключения в порядке, и приложение может получить доступ к БД
- Пользователь создается с помощью 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 с именем экземпляра по умолчанию на веб-сервере.