Форум программистов, компьютерный форум CyberForum.ru

C# и базы данных, ADO.NET

Войти
Регистрация
Восстановить пароль
 
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
#1

Предоставление данных зарегистрированному пользователю - C#

02.01.2017, 19:50. Просмотров 245. Ответов 13
Метки нет (Все метки)

Доброго времени суток!
Пишу БД для записи результатов тренировок, я регистрирую в ней пользователей пока в локальной бд phpmyadmin (таблица Users, например - рисунок в приложении), и связь с таблицей, например Run_bd - содержит сведения о тренировках, ориентированных на бег.
Возник вопрос: как мне сделать модель, чтобы зарегистрированный пользователь мог работать и видеть только со своими данными, и правильно ли будет хранить сведения в этой таблице, добавляющиеся со всех пользователей?
Не могу далее продвинуться из-за тупика такого
Миниатюры
Предоставление данных зарегистрированному пользователю  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2017, 19:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Предоставление данных зарегистрированному пользователю (C#):

Данные по каждому зарегистрированному преступнику - Turbo Pascal
картотека Интерпола данные по каждому зарегистрированному преступнику: Фамилия, имя, отчество, рост, цвет волос, цвет глаз,...

Получить путь к зарегистрированному в системе файл - C++ WinAPI
Вопрос простостой на первый взгляд надо получить путь к зарегистрированному в системе файлу например при запуске файла достаточно...

Предоставление услуг интернета - Сети
Добрый день уважаемые форумцы! Вопросов у меня огромное кол-во но начну все по порядку. 1. Какую биллинговую систему можете...

Предоставление значений в готовую программу - Delphi WinAPI
Здравствуйте, подскажите пожалуйста, если, например, имеется в наличии программа, в которой можно вручную в определенное поле вбивать...

Предоставление прав пользователям программно - MS Access
С помощью методов GetPermissions и SetPermissions можно получать и предоставлять права пользователям на таблицы и запросы. А какими...

предоставление доступа в интернет к единственному узлу - Сети
Доброго времени суток друзья. Возник следующий вопрос: необходимо организовать на работе электронную переписку через интернет, но при этом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OwenGlendower
Модератор
Эксперт .NET
6640 / 5618 / 2059
Регистрация: 17.03.2014
Сообщений: 10,735
Записей в блоге: 1
02.01.2017, 20:14 #2
EvilSky, очень просто - делай все операции с использованием id текущего авторизованного пользователя
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
02.01.2017, 20:24  [ТС] #3
Я думал, что структура таблица run_db хранила бы столбец id работающего с бд...Ну связь выходит ( users(1) - run_db(*)). Как тогда связать поля, чтобы работать от id зарегистрированного?
OwenGlendower
Модератор
Эксперт .NET
6640 / 5618 / 2059
Регистрация: 17.03.2014
Сообщений: 10,735
Записей в блоге: 1
02.01.2017, 20:39 #4
EvilSky, в таблице run_db нужно добавить колонку user_id которую сделать внешним ключом на users.id. При выборке данных делаем ... WHERE user_id = Id_Авторизованного_Пользователя, при INSERT добавляем строку с user_id текущего авторизованного пользователя. UPDATE, DELETE делаем по аналогии с SELECT. Таким образом каждый пользователь будет работать только со своими данными.
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
03.01.2017, 00:53  [ТС] #5
буду пробовать, спасибо!

Добавлено через 4 часа 9 минут
При авторизации: пользователь вбивает логин и пароль, то есть лучше будет сделать внешний ключ не к id, а к логину?
Выходит, что я не умею делать запросы... :
C#
1
"select * from Run_db where User_id = ID";
или
C#
1
"select Run_db.* , Users.* from Run_db, Users Where Run_db.User_id = Users.Username";
OwenGlendower
Модератор
Эксперт .NET
6640 / 5618 / 2059
Регистрация: 17.03.2014
Сообщений: 10,735
Записей в блоге: 1
03.01.2017, 09:57 #6
Цитата Сообщение от EvilSky Посмотреть сообщение
При авторизации: пользователь вбивает логин и пароль, то есть лучше будет сделать внешний ключ не к id, а к логину?
Скорее нет, чем да т.к. логин может и измениться что потребует внести изменения и в связанные таблицы. Кроме того число (колонка ID) занимает меньше места и более удобная с точки зрения хранения и поиска по нему.

Цитата Сообщение от EvilSky Посмотреть сообщение
Выходит, что я не умею делать запросы...
В запросы нужно подставлять значения из программы. Вместо ??? в этих запросах должно быть число соотвествующее ID авторизованного пользователя
SQL
1
SELECT * FROM Run_db WHERE User_id = ???
SQL
1
2
3
SELECT * FROM Run_db
JOIN Users ON Users.Id = Run_Db.User_id
WHERE USER.Id = ???
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
03.01.2017, 23:15  [ТС] #7
Из вашего примера выходит, что пользователю нужно будет ввести id своего аккаунта вручную... Или можно сделать запрос как бы из текстового поля по логину? ну вот логика приложения приведена в приложении:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private bool login(string Username, string Password)
        {
 
            db_connect();
            MySqlCommand check = new MySqlCommand();
            check.CommandText = "select * from Users Where Username = @User and Password= @Pass";
            check.Parameters.AddWithValue("@User", Username);
            check.Parameters.AddWithValue("@Pass", Password);
            check.Connection = connection;
            MySqlDataReader login = check.ExecuteReader();
            if (login.Read())
            {
                connection.Close();
                return true;
            }
            else
            {
                connection.Close();
                return false;
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void auth()
        {
            string Username = NameBox.Text;
            string Password = PassBox.Text;
 
            bool r = login(Username, Password);
            if (r)
            {
               MetroFramework.MetroMessageBox.Show(this, "Добро пожаловать, " + NameBox.Text + /*Settings.Default.Username+*/"!","Успешная авторизация", MessageBoxButtons.OK, MessageBoxIcon.Information);
                MainForm main = new MainForm();
                this.Close();
                main.Show();
            }
            else
               MetroFramework.MetroMessageBox.Show(this,"Неверный логин или пароль. Попробуйте снова!","Ошибка",MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
Миниатюры
Предоставление данных зарегистрированному пользователю  
OwenGlendower
Модератор
Эксперт .NET
6640 / 5618 / 2059
Регистрация: 17.03.2014
Сообщений: 10,735
Записей в блоге: 1
04.01.2017, 00:16 #8
Цитата Сообщение от EvilSky Посмотреть сообщение
Из вашего примера выходит, что пользователю нужно будет ввести id своего аккаунта вручную...
Ничего подобного. Нужно получить ID пользователя, запомнить его и использовать в дальнейших запросах.
insite2012
Модератор
Эксперт .NET
4400 / 3349 / 818
Регистрация: 12.10.2013
Сообщений: 9,925
Записей в блоге: 2
04.01.2017, 10:56 #9
EvilSky, как вариант, делайте запрос с логином и паролем пользователя, если данные верны - генерируйте уникальный Guid, записывайте его в поле таблицы БД и возвращайте его пользователю. Пользователь его запоминает и потом в каждом запросе его передает, при этом каждый рабочий запрос проверяется на совпадение идентификатора, тот ли пользователь запрашивает выполнение операции.
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
07.01.2017, 19:47  [ТС] #10
Все же склоняюсь к вашему решению. Ваш пример работает идеально :
SQL
1
 SELECT * FROM Run_db JOIN Users ON Users.ID = Run_Db.User_id WHERE User_id = 7"
- выводит все данные пользователя под id - 7, но сумма полей из 2 таблиц... Идеально, конечно, показать в 1 таблице.
Тогда действительно остается лишь получить ID пользователя... хотя не получается его получить =(
SQL
1
SELECT * FROM Run_db WHERE User_id = ???
Пробовал еще прописать вариант, где ID хранилось бы в каком-нибудь поле, но тогда таблица не заполняется..
C#
1
2
3
4
5
6
7
8
9
10
 private void fill()
        {
            DataSet DS = new DataSet();
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            
            adapter.SelectCommand = new MySqlCommand("select * from Run_db Where User_id = @id", connection);
            adapter.InsertCommand.Parameters.AddWithValue("@id", 7); // тут например тот же textbox.text, где хранился бы ID
           
            adapter.Fill(DS, "Run_db");
            metroGrid1.DataSource = DS.Tables["Run_db"];
OwenGlendower
Модератор
Эксперт .NET
6640 / 5618 / 2059
Регистрация: 17.03.2014
Сообщений: 10,735
Записей в блоге: 1
07.01.2017, 19:56 #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от EvilSky Посмотреть сообщение
Тогда действительно остается лишь получить ID пользователя... хотя не получается его получить =(
У тебя уже есть форма авторизации где выполняется проверка логина и пароля. Добавь туда код который получит ID пользователя и сохранит его в static переменную.
C#
1
2
3
4
static class Settings
{
    public static int CurrentUserId = -1;
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private bool login(string Username, string Password)
{
    bool success = false;
 
    db_connect();
    MySqlCommand check = new MySqlCommand();
    check.CommandText = "select * from Users Where Username = @User and Password= @Pass";
    check.Parameters.AddWithValue("@User", Username);
    check.Parameters.AddWithValue("@Pass", Password);
    check.Connection = connection;
    using (MySqlDataReader reader = check.ExecuteReader())
    {
        if (reader.Read())
        {
            Settings.CurrentUserId = (int)reader["ID"];
        }
    }
    connection.Close();
 
    return success;
}
И далее везде подставляй значение переменной Settings.CurrentUserId
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
07.01.2017, 20:20  [ТС] #12
Я тоже начал было записывать в настройки поле ID - но потом потерял ход мысли Хороший код
C#
1
(int)reader["ID"];
, таким образом можно будет потом по полю "ID" получить все остальные поля..
OwenGlendower
Модератор
Эксперт .NET
6640 / 5618 / 2059
Регистрация: 17.03.2014
Сообщений: 10,735
Записей в блоге: 1
07.01.2017, 20:23 #13
Цитата Сообщение от EvilSky Посмотреть сообщение
Хороший код (int)reader["ID"];
Это детский код. Если для тебя это в новинку, то следует изучить работу с ADO.NET
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 159
07.01.2017, 20:31  [ТС] #14
Да, в первый раз вижу такой код - очень помог... Век живи - век учись
Вообщем все решилось :
C#
1
2
3
4
5
6
7
8
9
10
11
private void fill()
        {
            DataSet DS = new DataSet();
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            
            adapter.SelectCommand = new MySqlCommand("select * from Run_db Where User_id = @id", connection);
            adapter.SelectCommand.Parameters.AddWithValue("@id", Settings.Default.ID);
           
            adapter.Fill(DS, "Run_db");
            metroGrid1.DataSource = DS.Tables["Run_db"];
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 20:31
Привет! Вот еще темы с ответами:

Запись, хранение и предоставление информации из файла - C++
Изучаю С++, сначала я прочел книгу «С++ за 21 день», она мне дала хоть какое то представление о С++, сейчас все изученное повторяю по книге...

Предоставление права доступа только на чтение - Windows Server
Здравствуйте, подскажите как можно предоставить доступ только на чтение пользователю в Win Server 2008. Чтобы данный пользователь мог...

Объединение двух сетей и предоставление доступа в интернет - Cisco
Добрый день. Второй день ковыряюсь с cisco успел уже убить конфиг загрузочный, забыть пароли и восстановиться. Есть такая задача: имеется...

Структура с динамическим массивом, предоставление памяти и её очистка - C++
Когда пытаюсь скомпилить выдает: z1-1.exe has triggered a breakpoint. Помогите разобраться. Вот Задача:Заданы два массива А(5) и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.01.2017, 20:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru