Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 05.08.2022
Сообщений: 36

Сложный запрос на вывод из БД в Datagridview

22.09.2022, 07:21. Показов 2813. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как написать правильный SQL-запрос по такому условию:

В моём winforms - приложению через форму авторизации ( по логину и паролю) авторизуются разные преподаватели. Например, преподаватель Иванов А.А. вводит свой Логин: Иванов А.А. и попадает на главную форму с Datagridview (как на Картинке), где есть различные записи с Различными преподавателями. Как написать SQL-запрос на выборку так, что бы после авторизации этому преподавателю Иванову А.А. открывался DataGridView только с теми записями , в которых есть фамилия Иванов А.А., а записи, с другими фамилиями преподавателей Иванов А.А. не мог видеть.

Записей в DataGridView на самом деле больше, но каждый Преподаватель (Пользователь) после прохода формы Авторизации и попадания на главное окно мог видеть только себя и свои записи.

У меня есть две таблицы : Plan_db (где собственно и есть весь DataGridView) , а также есть таблица register (где хранятся Логины и Пароли для входа в программу).

Также я создал отдельный класс DataStorage в который передаю Логин (Фамилию) преподавателя. Данный класс будет помогать сортировать информацию по Логину преподавателя.

Вот какой SQL-запрос я написал, но он не работает:

C#
1
string queryString = $"select * from Plan_db AND select * from register where login_user LIKE '%DataStorage.login_user%'"
Подскажите пожалуйста, какой SQL-запрос надо написать , что бы по исходя из авторизационного логина Преподавателя , программа выводила только записи конкретно для этого преподавателя. Какой Преподаватель (Пользователь) зашёл, то только касающиеся его записи и отображаются ему, а остальные ему недоступны (не видны).
Миниатюры
Сложный запрос на вывод из БД в Datagridview  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2022, 07:21
Ответы с готовыми решениями:

Сложный запрос Select и вывод в таблицу
Добрый день. Такой вопрос: когда создается форма и добавляется элемент таблица, в него можно привязать данные из одной таблицы (простой...

сложный запрос (для меня сложный)
Есть таблица с продажами услуг от разных фирм, есть таблица с оплатой за предоставленные услуги (при этом сумма оплат может не совпадать с...

Запрос за параметрами и вывод в dataGridView
Не совсем ясно, как написать запрос с параметром и вывести его потом в daraGridView. Вот на чем я попал в ступор: sql = "SELECT...

23
2296 / 1612 / 400
Регистрация: 26.06.2017
Сообщений: 4,774
Записей в блоге: 1
03.10.2022, 16:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от UltraMagnus Посмотреть сообщение
весь проект отправить
Подготовьте SQL-запросы для формирования тестовой БД (те, которые CREATE) и опубликуйте их тут. Этого будет достаточно, чтобы работать с аналогичной БД. Также покажите код авторизации, на примере тестовой записи. Ну и код заполнения DataStorage - остальное в данной теме не важно.
0
0 / 0 / 0
Регистрация: 05.08.2022
Сообщений: 36
03.10.2022, 17:15  [ТС]
AndreyVorobey, Я так предполагал что передается, но кода у меня нет другого - значит не передается.

Uswer, хорошо.

Добавлено через 18 минут
SQL-запросы CREATE:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE Plan_db (
id INT IDENTITY(1,1) NOT NULL,
fio_of VARCHAR(80) NOT NULL,
time_of INT NOT NULL,
discipline VARCHAR(50) NOT NULL,
semestr INT NOT NULL,
squad VARCHAR(50) NOT NULL,
test VARCHAR(80) NOT NULL,
PRIMARY KEY (id)
);
 
CREATE TABLE register(
id_user INT IDENTITY(1,1) NOT NULL,
login_user VARCHAR(50) NOT NULL,
password_user VARCHAR(50) NOT NULL,
is_admin bit
);
 
SELECT * FROM register
 
INSERT INTO register (login_user, password_user, is_admin) VALUES ('admin', 'asd', 1)
 
INSERT INTO Plan_db (fio_of, time_of, discipline, semestr, squad, test) VALUES('Иванов А.А.', 84, 'Системное программирование', 3, '11532', 'Экзамен' )
Полный Код формы авторизации:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;
 
namespace Teachers_Plan2
{
    public partial class log_in : Form
    {
        DataBase database = new DataBase(); 
        
        public log_in()
        {
            InitializeComponent();
            StartPosition = FormStartPosition.CenterScreen;
        }
 
        private void log_in_Load(object sender, EventArgs e)
        {
            textBox_password.PasswordChar = '*';
            textBox_login.MaxLength = 50;
            textBox_password.MaxLength = 50;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var loginUser = textBox_login.Text;
            var passUser = textBox_password.Text;
            
            SqlDataAdapter adapter = new SqlDataAdapter();
            DataTable table = new DataTable();
 
            string querystring = $"select id_user, login_user, password_user, is_admin from register where login_user = '{loginUser}' and password_user = '{passUser}'";
 
            SqlCommand command = new SqlCommand(querystring, database.getConnection());
            adapter.SelectCommand = command;
            adapter.Fill(table);
 
            if(table.Rows.Count == 1)
            {
                var user = new checkUser(table.Rows[0].ItemArray[1].ToString(), Convert.ToBoolean(table.Rows[0].ItemArray[3]));
                
                MessageBox.Show("Вы успешно вошли!", "Успешно!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Form1 frm1 = new Form1(user);
                this.Hide();
                frm1.ShowDialog();
                this.Show();
            }
            else 
                MessageBox.Show("Такого аккаунта не существует!", "Аккаунта не существует!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
 
 
        }
 
        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            sign_up frm_sign = new sign_up();
            frm_sign.Show();
            this.Hide();
        }
 
        private void btnClear_Click(object sender, EventArgs e)
        {
            textBox_login.Text = "";
            textBox_password.Text = "";
        }
    
    }
}

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

Есть еще форма Form1, где собственно и выводится DataGridView.
Вот кусочек кода из формы Form1 в котором необходимо видоизменить SQL-запрос (я скидывал ранее скриншот в предыдущих сообщениях):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void RefreshDataGrid(DataGridView dgw)
        {
            dgw.Rows.Clear();
 
            string queryString = $"select * from Plan_db";
 
            SqlCommand command = new SqlCommand(queryString, dataBase.getConnection());
 
            dataBase.openConnection();
 
            SqlDataReader reader = command.ExecuteReader();
 
            while(reader.Read())
            {
                ReadSingleRow(dgw, reader);
            }
            reader.Close();
        }
0
2296 / 1612 / 400
Регистрация: 26.06.2017
Сообщений: 4,774
Записей в блоге: 1
03.10.2022, 21:18
Лучший ответ Сообщение было отмечено UltraMagnus как решение

Решение

Повторил Ваш код, чуть подправил его и выявил проблему - добро пожаловать под кат.
Недостающий класс пользователя.
C#
1
2
3
4
5
6
7
8
9
10
11
12
  class User
  {
    public User( int id_user,string login_user)
    {
      this.login_user = login_user;
      this.id_user = id_user;
    }
 
    public int id_user { get; set; }
    public string login_user { get; set; }
 
  }
DataStorage
C#
1
2
3
4
  class DataStorage
  {
    public static User currentUser;
  }
Форма авторизации
Кликните здесь для просмотра всего текста
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
 
namespace AuthorizationForm
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
 
    private void button1_Click(object sender, EventArgs e)
    {
      var loginUser = textBox_login.Text;
      var passUser = textBox_password.Text;
 
      string querystring = $"select id_user, login_user, password_user, is_admin from register where login_user = N'{loginUser}' and password_user = N'{passUser}'";
      string connectString = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = Users; Integrated Security = True;";
 
      using (SqlConnection connection = new SqlConnection(connectString))
      {
        SqlCommand command = new SqlCommand(querystring, connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
 
        if (reader.Read())
        {
          var user = new User(reader.GetInt32(0), reader.GetString(1));
          DataStorage.currentUser = user;
          MessageBox.Show("Вы успешно вошли!", "Успешно!", MessageBoxButtons.OK, MessageBoxIcon.Information);
          //Form1 frm1 = new Form1(user);
          //this.Hide();
          //frm1.ShowDialog();
          //this.Show();
        }
        else
          MessageBox.Show("Такого аккаунта не существует!", "Аккаунта не существует!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        connection.Close();
      }
 
    }
  }
}

Собственно проблема в типах данных в БД и приложении. Ваш запрос на создание таблиц я исправил:
SQL
1
2
3
4
5
6
CREATE TABLE [dbo].[register] (
    [id_user]       INT           IDENTITY (1, 1) NOT NULL,
    [login_user]    NVARCHAR (50) NOT NULL,
    [password_user] NVARCHAR (50) NOT NULL,
    [is_admin]      BIT           NULL
);
Затем добавил данные так:
SQL
1
INSERT INTO Plan_db (fio_of, time_of, discipline, semestr, squad, test) VALUES(N'Иванов А.А.', 84, N'Системное программирование', 3, N'11532', N'Экзамен' )
и ... всё получилось!
0
0 / 0 / 0
Регистрация: 05.08.2022
Сообщений: 36
03.10.2022, 22:04  [ТС]
Спасибо огромное! Помогло!! Работает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2022, 22:04

LINQ запрос, вывод в DataGridView
Требуется вывести один столбец (name) из всей таблицы. При данном коде выводятся все столбцы. CopyToDataTable не позволяет работать с...

Вывод пустой таблицы в dataGridView через sql запрос
Проблема такая. Если у меня в базе данных в таблице нету ни одной строки, и если я выведу столбцы этой таблицы в dataGridView select ........

сложный запрос
Народ создал БД на тему экзаменирования студентов. задание создать БД в табличном представлении, исходные данные: 1)Студенты ...

Сложный запрос
Сгруппировать по keyGroup. Если в группе больше одной записи Если в группе есть хоть одна запись у которой isFirst = 1, получить...

Сложный запрос к БД
Здравcтвуйте! Ниже рабочий запрос, который получает информацию о товаре из четырех таблиц для последующего перебора и вывода товаров в xml...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru