#c# #asp.net-membership
#c# #asp.net-членство
Вопрос:
Я новичок в C #, использующий членство для обработки пользователей.
Я унаследовал код, который я не писал.
Код пытается получить всех пользователей, чтобы он мог отобразить все в таблице. Другой вариант, который он пытается сделать, это показать каждую букву в алфавите для фильтрации по букве. Вот код:
private void Page_PreRender()
{
if (Alphalinks.Letter == "All")
{
Users.DataSource = Membership.GetAllUsers();
}
else
{
Users.DataSource = Membership.FindUsersByName(Alphalinks.Letter "%");
}
Users.DataBind();
}
Ошибка, с которой я столкнулся, находится в этой строке:
Users.DataSource = Membership.GetAllUsers();
Когда я запускаю страницу, она выдает ошибку:
Элемент уже добавлен. Ключ в словаре: ‘2309’ Добавляется ключ: ‘2309’.
Трассировка стека:
System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) 14328157
System.Web.Security.MembershipUserCollection.Add(MembershipUser user) 268
System.Web.Providers.DefaultMembershipProvider.GetAllUsers(Int32 pageIndex, Int32 pageSize, Int32amp; totalRecords) 315
System.Web.Security.Membership.GetAllUsers() 37
ASP.admin_access_users_aspx.Page_PreRender() in x:xxxxxxxxPMAdminaccessusers.aspx:9
System.EventHandler.Invoke(Object sender, EventArgs e) 0
System.Web.UI.Control.OnPreRender(EventArgs e) 11725240
System.Web.UI.Control.PreRenderRecursiveInternal() 132
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 4005]
Я просмотрел аналогичную ситуацию в StackOverflow, и мне сказали, что это вызвано дублированием имен пользователей… обычно в нижнем регистре.
Моя проблема в том, что я не знаю, откуда это берется. У меня нет ‘2309’ в моих таблицах пользователей или членства.
Мое соединение по умолчанию в web.config: <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=xxxxxx;Initial Catalog=xxxPM;Persist Security Info=True;User ID=sa;Password=xxxx" />
Следующее в web.config указывает на это DefaultConnection:
<profile defaultProvider="DefaultProfileProvider">
<providers>
<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
</providers>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordFormat="Clear" applicationName="/" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="DefaultRoleProvider">
<providers>
<add connectionStringName="DefaultConnection" applicationName="/" name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</providers>
</roleManager>
База данных SQL в этом соединении имеет таблицу пользователей и таблицу членства. Я выполнял подобные запросы для таблиц Users и Memberships:
SELECT COUNT(username) cnt,
Lower(Username) as Username
FROM [xxxxPMTest].[dbo].[Users]
GROUP BY UserName
HAVING COUNT(username) > 1
Чтобы убедиться, что у меня есть уникальные пользователи. Возвращено 0 записей.
Я не могу найти никаких дубликатов.
Я пробовал комментировать Пользователей.Источник данных = Членство.GetAllUsers(); и страница загрузится, показывая все буквы алфавита, разделенные для фильтрации. Нажатие на каждую букву правильно фильтрует пользователей, и ни на одной из страниц нет никаких ошибок (которые я ожидал бы обнаружить, если бы на самом деле была дублирующаяся запись). Я не могу понять, почему я получаю эту ошибку.
Что я делаю не так? Что я могу добавить, чтобы проверить, существует ли ключ уже в Членстве?Получите доступ к пользователям, прежде чем добавлять его к пользователям.Источник данных? Это вообще правильный подход?
— отредактированный SQL-запрос —
Комментарии:
1. Разве ваш sql-запрос не ошибочен? Разве вы не хотели бы убедиться, что count равен> 1?
2. Я думаю, вы должны выяснить, что такое «2309». Вероятно, дубликат первичного ключа, но это всего лишь предположение.
3. Вы не увидите дубликат со словарем. Словарь не позволит добавлять дубликат. Похоже, что в таблице UserName есть имя и идентификатор. Имя пользователя уже есть в таблице, и вы получаете исключение, когда имя уже существует. Какое имя вы добавляете? Вы проверили, есть ли это имя уже в таблице?
4.
GROUP BY LOWER(UserName)
Изменяет ли поведение?5.
HAVING COUNT(username) < 1
Как это вообще может быть правдой? Как это ЧИСЛО могло быть равно 0?