Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 50
1

Как найти пользователя в базе?

10.03.2018, 14:50. Показов 1866. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно создать форму с окном авторизации, и если имя есть в базе - тогда авторизация проходит успешно. Если пользователя нет - тогда пользователь проходит её ещё раз. Форму я создал, но не могу понять как искать пользователя в базе. Допустим, ввожу имя "Vasya Pupkin", и если он есть в базе - тогда авторизация успешна и открывается меню. Может кто подсказать? Может, запрос какой нужен или что?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2018, 14:50
Ответы с готовыми решениями:

"Ошибка входа пользователя" при подсоединении к базе данных
При нажатии на кнопку Запуск хранимой процедуры выдает ошибку: Необработанное исключение типа...

как получить доступ к почтовой базе пользователя
пользователь работает в лотусе, допустим он зашел в какую нибудь базу, кликнул на ссылку в...

Как сделать html-страницу с регистрацией пользователя в базе sqlite?
Добрый день. Нужно сделать HTML страничку с возможностью регистрации пользователя в базе Sql...

Добавление пользователя к базе данных
Добрый день. У меня уже есть база данных library , созданная не мною. Нужно в ней мне создать трех...

17
.NET senior
440 / 358 / 137
Регистрация: 23.09.2016
Сообщений: 980
10.03.2018, 16:31 2
Infidel, ну если Вам нужно проверить наличие пользователя в базе - логично предположить, что нужно выполнить запрос на поиск пользователя с указанным именем. Без схемы данных, без уже реализованного кода это похоже на гадание без фотографии, так что от Вас нужно больше информации. Не клещами же всё тянуть, в самом деле.
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 50
10.03.2018, 17:07  [ТС] 3
Да у меня особо пока ничего и нет, я создал форму с полями для ввода логина, пароля, имени пользователя, и...всё. Застрял и не могу понять как искать пользователя в базе.

Цитата Сообщение от bax_tang Посмотреть сообщение
нужно выполнить запрос на поиск пользователя с указанным именем
Но ведь это не сработает, тогда поиск будет только по указанному имени, а остальных искать не будет. Не писать же мне запросы на 100 юзеров? Может быть тут нужна хранимая процедура? Но как её использовать чтобы программа искала юзера, которого я ввел в поле авторизации я не знаю.
0
.NET senior
440 / 358 / 137
Регистрация: 23.09.2016
Сообщений: 980
10.03.2018, 18:06 4
Infidel, чтобы искать пользователя в базе - количество критериев тут вообще роли не играет - как минимум должна быть в наличии база, в которой нужно производить поиск, чтобы сразу проверять работоспособность приложения. В настоящий момент я могу Вам помочь только тем, что посоветую:
1) создать базу
2) спроектировать схему данных
3) определиться с алгоритмом поиска пользователя
4) выбрать технологию для доступа к БД (чистый ADO.NET или какой-нибудь Entity Framework)
5) написать больше кода, столкнуться с реальной проблемой - например, когда что-то не будет работать так, как Вы ожидаете
6) и вот теперь с чистой совестью писать на форум: "я сделал вот это, это и это, вот код, и чот вот тут нифига не работает, укажите на ошибку плз"

Как-то так.
1
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
10.03.2018, 20:23 5
1. Создаешь БД, а в ней таблицу пользователей, например:

SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE DirUser(
   UId INT IDENTITY(1,1) PRIMARY KEY,
   ULogin VARCHAR(20) UNIQUE NOT NULL,
   UPassword VARCHAR(20) NOT NULL,
   UName VARCHAR(MAX) NOT NULL)
 
INSERT INTO DirUser (ULogin,UPassword,UName,UState)
   VALUES ('User1','123',Иванов,)
INSERT INTO DirUser (ULogin,UPassword,UName,UState)
   VALUES ('User2','123','Петров',)
2. Открываешь новый проект MVC4 (пустой).
3. В модели добавляешь ADO EDM, создаешь соединение со своей БД
4. Выбираешь в модель созданную таблицу пользователей
5. Добавляешь контроллер Home, в нем набираешь (вместо EDMMobTelEntities вводишь имя своей модели из context.cs модели), при этом в коде AppStart.RouteConfig.cs вместо "index" пишешь "Login") :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class HomeController : Controller
{
       EDMMobTelEntities DB = new EDMMobTelEntities();
 
        [HttpGet]
        public ActionResult Login()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Login(DirUser user)
        {
            string sSQL = "SELECT * FROM DirUser WHERE ULogin = '"+user.ULogin+"' AND UPassWord='"+user.UPassword+"'";
            IEnumerable<DirUser> usr = DB.DirUser.SqlQuery(sSQL);
            if (usr.Count() == 0)
                return RedirectToAction("Login");
            else
                return RedirectToAction("Index");
        }
 
        public ActionResult Index()
        {
            return View();
        }
}
6. Создаешь типизированную View с именем Login :
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@model PFRResp.Models.DirUser
 
@{
    Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Вход на ресурс</title>
</head>
<body>
    <script src="~/Scripts/jquery-1.7.1.min.js"></script>
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    
    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
    
        <fieldset>
            <legend>Пожалуйста, авторизируйтесь</legend>
    
            <div>Логин&nbsp:&nbsp 
                @Html.EditorFor(model => model.ULogin)
                @Html.ValidationMessageFor(model => model.ULogin)
            </div>
    
            <div>Пароль&nbsp:&nbsp 
                @Html.EditorFor(model => model.UPassword)
                @Html.ValidationMessageFor(model => model.UPassword)
            </div>
            <p>
                <input type="submit" value="Вход" />
            </p>
        </fieldset>
    }
    
</body>
</html>
7. Добавляешь в контроллер метод Index и вьюху Index, в которой пишешь "Привет !"

Далее натягиваешь стили, добавляешь валидацию, окно неверного входа и т.д.

Добавлено через 6 минут
Поправка и дополнение

Поправка
Из списка полей в INSERT убрать поле UState (забыл вырезать при копировании из своего кода)

Дополнение
Вот неплохая книжка, по которой сам учусь

https://metanit.com/sharp/mvc/
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 50
10.03.2018, 22:54  [ТС] 6
Спасибо, дружище! Твоя помощь неоценима!

Добавлено через 2 минуты
У меня ещё вопрос: а это только с MVC можно сделать? Мне просто желательно без него организовать эту проверку.
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
11.03.2018, 06:08 7
Infidel, тип приложения не играет роли. База и в Африке будет базой. MVC, видимо, чисто для примера было взято.

Вам нужно определиться с типом СУБД, которую будете испльзовать (у них есть различия в диалекте SQL и прочие различия), определиться со схемой данных (что будет храниться и как оно будет связано), определиться с тем, будете ли вручную работать с СУБД или через ORM. Вам об этом уже писали.

Я вам рекомендую (моё видение основанное на предположении, что проект учебный):
* СУБД - MSSQL Express (очень проста в установке и настройке, бесплатна, ограничение на базу - 10Гб), рекомендую потому, что проста в использовании (важно для новичков)
* Рекомендую работать с базой через ADO.NET, вручную, но с применением Dapper.NET для ухода от рутины. Рекомендую для того, чтобы "набить руку" в понимании SQL-a
* Со схемой особо нечего порекомендовать, это вам самому нужно придумать. Идую с пользователями вам уже подкинули: таблица в которой будет храниться логин и хеш пароля (сам пароль хранить ни в коем случае нельзя!)

Добавлено через 1 минуту
MsGuns, причём тут ASP.NET MVC и нафига нужен EF с ручным формированием запросов, да ещё и конкатенацией (фу!)?
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
11.03.2018, 13:09 8
Цитата Сообщение от Usaga Посмотреть сообщение
причём тут ASP.NET MVC и нафига нужен EF с ручным формированием запросов, да ещё и конкатенацией (фу!)?
Это был работающий пример, который пишется за 10 минут. Не шедевр, конечно, но и я не джидай, а только учусь. Упреки опытных шарпистов в "кривости" и "некрасивости" меня не смущают - продолжайте стебаться

Добавлено через 4 минуты
Использование SQLQuery (прямого запроса) объясняется просто: метод Find работает только с UID, а Where я не понял как работает (пока), вот и заюзал то, что мне хорошо известно, т.е. сиквель. А Вы бы, уважаемый, вместо кнута попробовали бы прняник - т.е. подсказали как нужно
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
11.03.2018, 13:55 9
MsGuns, над вами тут никто не стебался. Я вам намекнул, что так вообще не делается. Прямая работа с SQL в EF используется только в крайних случаях. Почитайте online-учебник по EF. Там информации не то, чтобы горы, за пару вечеров осилите.
1
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
11.03.2018, 16:31 10
Цитата Сообщение от MsGuns Посмотреть сообщение
а Where я не понял как работает (пока)
Хотя бы так:
C#
1
2
3
4
5
6
7
8
9
        [HttpPost]
        public ActionResult Login(DirUser user)
        {
            int userCount = DB.DirUser.Where(u => u.Login == user.Login && u.UPassWord == user.UPassword).Count();
            if (userCount == 0)
                return RedirectToAction("Login");
            else
                return RedirectToAction("Index");
        }
Или без Where
C#
1
            int userCount = DB.DirUser.Count(u => u.Login == user.Login && u.UPassWord == user.UPassword);
1
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
11.03.2018, 22:03 11
Мне больше так понравилось :

C#
1
2
3
       DirUser user1 = DB.DirUser.FirstOrDefault(p => p.ULogin == user.ULogin && p.UPassword == user.UPassword);
       if (user1 == null)
            ...
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
12.03.2018, 05:51 12
Цитата Сообщение от MsGuns Посмотреть сообщение
Мне больше так понравилось :
Так имеет смысл делать только, если вам сам объект user1 нужен. Если вам нужно узнать только наличие записи, то вытаскивать весь объект, что бы его на null проверить, расточительно. Для этого есть метод Count.
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
12.03.2018, 14:34 13
Цитата Сообщение от Usaga Посмотреть сообщение
Для этого есть метод Count.
Я в курсе. Благодаря Вашей ссылке. Но в данном случае запись короткая и не даст большой нагрузки на Сеть. А вообще, конечно, замечание справедливое.
Кстати, из всей полученной записи мне только id и нужен. Для того и First..
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
12.03.2018, 16:16 14
Цитата Сообщение от MsGuns Посмотреть сообщение
Кстати, из всей полученной записи мне только id и нужен.
Так его отдельно и запрашивайте. EF умеет делать "проекции" - это когда вы только часть данных запрашиваете:

Анонимный класс
C#
1
2
3
4
5
6
7
var  user1 = DB.DirUser
    .Where(p => p.ULogin == user.ULogin && p.UPassword == user.UPassword)
    .Select(p => new { Id = p.Id })
    .FirstOrDefault();
 
if (user1 != null) {
    // Работаем с user1.Id

Класс DTO
C#
1
2
3
4
5
6
7
var  user1 = DB.DirUser
    .Where(p => p.ULogin == user.ULogin && p.UPassword == user.UPassword)
    .Select(p => new SomeCustomClass { Id = p.Id, ещё свойства })
    .FirstOrDefault();
 
if (user1 != null) {
    // Работаем с user1.Id
Можно выбирать как свойства одного класса-модели так и результат разного рода JOIN-ов.
1
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
12.03.2018, 23:40 15
Цитата Сообщение от Usaga Посмотреть сообщение
Класс DTO
Вот это для меня сложновато еще Что это за SomeCustomClass, с чем его едят ?
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
13.03.2018, 03:57 16
MsGuns, Data Transfer Object. Просто класс для передачи данных. Если вам нужно получить из базы только часть того, что входит в состав класса модели контекста (или в ином виде), то можно сделать отдельный класс и использовать описанным выше способом, а не вытаскивать всю запись, чтобы взять только одно свойство.
1
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
13.03.2018, 15:09 17
Usaga,
Был бы премного обязан, если бы Вы привели конкретный пример с джоинами на нескольким таблицам
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
13.03.2018, 18:13 18
MsGuns, допустим у нас в контексте есть две модели вида:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public class Address
    {
        public int Id { get; set; }
        public string FullAddress { get; set; }
 
        public ICollection<User> Users { get; set; }
 
        //Ещё 100500 свойств
    }
 
    public class User
    {
        public int Id { get; set; }
        public string Nickname { get; set; }
 
        public int? Address_Id { get; set; }
        public Address Address { get; set; }
 
        //Ещё 100500 свойств
    }


В какой-то момент нам понадобилось выдернуть из базы только пары "Ник-Улица". Мы можем вытащить весь агрегат и взять из него только нужное:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
var user = cont.Users
                    .Include(x => x.Address)
                    .FirstOrDefault();
Console.WriteLine($"{user.Nickname} lives at {user.Address.FullAddress}");


Это сработает, но EF вытащит всю запись из таблицы пользователей и соответствующую её запись из таблицы адресов, хотя нам, по факту, нужно из каждой всего по одному полю (свойства в моделях: Nickname и FullAddress).

Но мы можем инструктировать EF о том, что конкретно нам надо, какие поля выдернуть, что нам не нужно ВСЁ. Для этого мы введём класс для нашей текущей хотелки (пара свойств: ник и адрес):
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
class UserAddress
{
    public string Nick { get; set; }
    public string Address { get; set; }
}


И попросим EF вытащить только два поля из связанных таблиц и запихнуть в наш специальный класс:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
var dto = cont.Users
                    .Include(x => x.Address)
                    .Select(x => new UserAddress
                    {
                        Nick = x.Nickname,
                        Address = x.Address.FullAddress
                    })
                    .FirstOrDefault();
Console.WriteLine($"{dto.Nick} lives at {dto.Address}");


Всё. EF сходит в базу не за всеми полями записей, а только за двумя, что сильно эффективнее таскания всего подряд.

Добавлено через 6 минут
Такой подход не только позволяет конкретизировать запрашиваемые данные, но так же позволяет производить некие простые преобразования данных при выборке из базы.

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class OtherUserAddress
    {
        public string UserAddress { get; set; }
    }
 
    var dto2 = cont.Users
        .Include(x => x.Address)
        .Select(x => new OtherUserAddress
        {
            UserAddress = "User " + x.Nickname + " lives at " + x.Address.FullAddress
        })
        .FirstOrDefault();
 
    Console.WriteLine(dto2.UserAddress);
1
13.03.2018, 18:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2018, 18:13
Помогаю со студенческими работами здесь

Создать пользователя в базе данных
Здравствуйте! Подскажите, почему не работает запрос к MySQL серверу. При создании через...

Проверка наличия пользователя в базе
Здравствуйте, у меня есть маленькая проблемка с проверкой в БД. Суть заключается в том что Юзер...

Доступ к базе в зависимости от имени пользователя
Добрый день, растет используемая база, и растут запросы на доступ к ней... растут также и желания...

Авторизиция пользователя, генерация случайных паролей с заменой их в базе
Доброе время суток, пожалуйста прошу помощи в написании программы по иформационной безопасности....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru