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

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

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

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

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

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

C# Из базы данных сгенерировал модель. Как теперь через нее обращаться к базе данных
Замена полей баз данных в целях защиты данных C#
Запись данных в базу данных mdb с использованием DataAdapter и DataSet C#
C# Создания базы данных и таблиц в базу данных в SQL Server Managment Studio
C# При подключении базы данных в источниках данных отображаются не все процедуры
C# Обновление данных из базы данных в клиентах в реальном времени
Получение данных от SQL сервера и отображение данных в DataGridView C#
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OwenGlendower
Модератор
Эксперт .NET
5762 / 4773 / 1737
Регистрация: 17.03.2014
Сообщений: 8,843
Записей в блоге: 1
02.01.2017, 20:14     Предоставление данных зарегистрированному пользователю #2
EvilSky, очень просто - делай все операции с использованием id текущего авторизованного пользователя
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 143
02.01.2017, 20:24  [ТС]     Предоставление данных зарегистрированному пользователю #3
Я думал, что структура таблица run_db хранила бы столбец id работающего с бд...Ну связь выходит ( users(1) - run_db(*)). Как тогда связать поля, чтобы работать от id зарегистрированного?
OwenGlendower
Модератор
Эксперт .NET
5762 / 4773 / 1737
Регистрация: 17.03.2014
Сообщений: 8,843
Записей в блоге: 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
Сообщений: 143
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
5762 / 4773 / 1737
Регистрация: 17.03.2014
Сообщений: 8,843
Записей в блоге: 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
Сообщений: 143
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
5762 / 4773 / 1737
Регистрация: 17.03.2014
Сообщений: 8,843
Записей в блоге: 1
04.01.2017, 00:16     Предоставление данных зарегистрированному пользователю #8
Цитата Сообщение от EvilSky Посмотреть сообщение
Из вашего примера выходит, что пользователю нужно будет ввести id своего аккаунта вручную...
Ничего подобного. Нужно получить ID пользователя, запомнить его и использовать в дальнейших запросах.
insite2012
Модератор
Эксперт .NET
4293 / 3242 / 792
Регистрация: 12.10.2013
Сообщений: 9,603
Записей в блоге: 2
04.01.2017, 10:56     Предоставление данных зарегистрированному пользователю #9
EvilSky, как вариант, делайте запрос с логином и паролем пользователя, если данные верны - генерируйте уникальный Guid, записывайте его в поле таблицы БД и возвращайте его пользователю. Пользователь его запоминает и потом в каждом запросе его передает, при этом каждый рабочий запрос проверяется на совпадение идентификатора, тот ли пользователь запрашивает выполнение операции.
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 143
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
5762 / 4773 / 1737
Регистрация: 17.03.2014
Сообщений: 8,843
Записей в блоге: 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
Сообщений: 143
07.01.2017, 20:20  [ТС]     Предоставление данных зарегистрированному пользователю #12
Я тоже начал было записывать в настройки поле ID - но потом потерял ход мысли Хороший код
C#
1
(int)reader["ID"];
, таким образом можно будет потом по полю "ID" получить все остальные поля..
OwenGlendower
Модератор
Эксперт .NET
5762 / 4773 / 1737
Регистрация: 17.03.2014
Сообщений: 8,843
Записей в блоге: 1
07.01.2017, 20:23     Предоставление данных зарегистрированному пользователю #13
Цитата Сообщение от EvilSky Посмотреть сообщение
Хороший код (int)reader["ID"];
Это детский код. Если для тебя это в новинку, то следует изучить работу с ADO.NET
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 20:31     Предоставление данных зарегистрированному пользователю
Еще ссылки по теме:

C# Какой тип базы данных лучше выбрать для небольшого количества данных
Сохранение данных из datagridview в базу данных под MS sql server 2012 C#
База данных Строительство - подсчет числовых данных, выведенных в webbrowser C#
Пишу базу данных на основе данных из базы access C#
LINQ2DB : имея классы описывающие таблицы базы данных сгенерировать непосредственно базу данных C#

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

Или воспользуйтесь поиском по форуму:
EvilSky
2 / 2 / 0
Регистрация: 17.11.2014
Сообщений: 143
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"];
}
Yandex
Объявления
07.01.2017, 20:31     Предоставление данных зарегистрированному пользователю
Ответ Создать тему
Опции темы

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