Alish93 Ответов: 1

Как пользователи ролей могут иметь свои собственные права с помощью SQL?


Я создал приложение windows form. Таким образом, есть несколько форм, таких как: форма входа в систему, форма регистрации, главная страница. Поэтому, если вы зарегистрируетесь и будете готовы войти в систему, вы будете перенаправлены на главную страницу. Я хочу написать там код, скажем, если я зарегистрирован как "Али", то это имя пользователя видит только те контакты в основной форме. Основная форма состоит из страницы контактов. Таким образом,пользователь может добавлять, обновлять и удалять значения оттуда. Но, как я уже говорил, только тот, кто сделал эту запись, должен сделать это. Поэтому у меня есть datagridview в форме контакты(главная) для отображения записей

Что я уже пробовал:

SqlConnection con = new SqlConnection();
       SqlCommand cmd = new SqlCommand();
       private void button1_Click(object sender, EventArgs e)
       {
           con = new SqlConnection(DALC.Getconnectionstring());
           con.Open();
           cmd = new SqlCommand("INSERT INTO CONTACTS VALUES(@name,@surname,@company,@country_code,@prefix,@number,@insert_user)",con);
           cmd.Parameters.AddWithValue("@name", textBox1.Text);
           cmd.Parameters.AddWithValue("@surname", textBox2.Text);
           cmd.Parameters.AddWithValue("@company", textBox3.Text);
           cmd.Parameters.AddWithValue("@country_code", textBox4.Text);
           cmd.Parameters.AddWithValue("@prefix", textBox5.Text);
           cmd.Parameters.AddWithValue("@number", textBox6.Text);
           cmd.Parameters.AddWithValue("insert_user", textBox7.Text);
           if (con.State == ConnectionState.Closed)
           {
               con.Open();
           }
           try
           {
               cmd.ExecuteNonQuery();
               MessageBox.Show("Success");
           }
           catch (SqlException ex)
           {

               MessageBox.Show(ex.Message);
           }
           finally
           {
               con.Close();
               con.Dispose();
           }
           contacts form = new contacts();
           form.Show();
           this.Hide();
       }
   }

Gerry Schmitz

Поместите идентификатор пользователя в запись. Затем сравните id в следующий раз.

1 Ответов

Рейтинг:
2

OriginalGriff

Без вашей фактической базы данных мы не можем быть конкретными, но, как говорит Джерри, "поместите идентификатор в запись". Поэтому добавьте столбец "AuthorisedUser", а когда вы вставляете строку, установите ее на идентификатор пользователя, выполняющего вставку.

Затем вы можете добавить это в предложение WHERE при выполнении операций выбора и обновления:

UPDATE ... WHERE AuthorisedUser = @UID AND RowID = ...

Я подозреваю, что именно для этого существуют ваши столбцы "insert_user", но мы действительно не можем сказать.

Но есть еще пара вещей:
1) Сделайте себе одолжение и прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...

2) Проверьте типы столбцов. Вы передаете текстовые строки для каждого значения там, и хотя это, вероятно, правильно для имени, фамилии и т. д., Для "insert_user" это, вероятно, очень неправильно, так как этот идентификатор пользователя, скорее всего, является числовым полем идентификации (или если это не так, то, вероятно, должно быть) - вы не должны хранить идентификатор пользователя в виде строки более одного раза во всем приложении!
Обычно у вас есть две таблицы: одна содержит сведения о пользователе: идентификатор пользователя, имя, пароль... и отдельная, в которой хранятся данные. Использование строки здесь подразумевает, что вы используете строки для всего, и это очень плохая идея, которая даст вам проблемы позже. Всегда храните значения в наиболее подходящем типе!

3) Всегда перечисляйте свои столбцы, никогда не вставляйте их в порядке следования столбцов по умолчанию:
INSERT INTO MyTable ([Name], Surname, ...) VALUES (@NAME, @SURNAME, ...)
Вместо
INSERT INTO MyTable VALUES (@NAME, @SURNAME, ...)
поскольку это делает две вещи: это делает ваш код более "будущим доказательством" - если порядок БД изменяется, ваш код не падает или, что еще хуже, не набирает данные в неправильные столбцы; и это означает, что он все еще работает, когда ваше значение идентификатора строки (которое, если у вас его нет, черт возьми, должно быть) является полем идентификации. Если вы не укажете столбцы, SQL будет начинаться с "самого верхнего" столбца и принимать порядок, что опасно.

4) вместо использования try...finally рассмотрим а using блок вместо этого:
private void button1_Click(object sender, EventArgs e)
{
   using (SqlConnection con = new SqlConnection(DALC.Getconnectionstring()))
   {
       con.Open();
       using (SqlCommand cmd = new SqlCommand("...",con))
       {
           ...
           try
           {
               ...
           }
           catch (SqlException ex)
           {
               ...
           }
       ...
       }
   }
Таким образом, объекты БД будут закрыты и удалены автоматически, когда они выйдут за пределы области видимости.


Alish93

как я могу показать вам его с картинками? Я знаю ваши 3-ю и 4-ю рекомендации. Это был тестовый код, вот почему я их не заметил.
У меня есть два стола:

1)контакты(где хранится информация о пользователях) таблица типа:
Имя столбца: тип данных:
Идентификатор инт
Имя варчар(30)
Фамилия типа varchar(30)
Компания варчар(30)
INSERT_USER инт

2)пользователи(регистрационная информация пользователей), как это:
ИМЯ СТОЛБЦА: ТИП ДАННЫХ:
Идентификатор инт
Имя пользователя varchar(30)
Фамилия типа varchar(30)
Имя варчар(30)
Фамилия типа varchar(30)



Поэтому я хочу сказать, что если зарегистрированный пользователь войдет на главную страницу=> Он/она перейдет в таблицу контактов. в этой форме у меня есть datagridview ниже, кнопка добавления,обновления и удаления. Поэтому, если я добавлю некоторые контакты в эту таблицу(в форме 3. Форма 1-это страница входа, форма 2-Страница регистрации), я сам должен увидеть эти контакты. Как я могу написать код, чтобы другой вошедший пользователь не мог видеть этот контакт? Я думаю, что столбец insert_user - это мой внешний ключ, а ID в таблице USER-первичный ключ. Если у вас есть что-то, с чем вы можете поддерживать связь, я могу это показать