28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186

Правильная выгрузка данных в DataGridView

12.01.2022, 09:48. Показов 3474. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возник такой вопрос. Есть следующая ER-модель(скриншот 1). Работаю с SQLite. Мне нужно считать данные из БД, соответственно сущность BOOK я считываю в DataGridView по столбцам аналогично атрибутам. Вопрос в том, как подтягивая таблицу авторов, если их больше одного, добавить еще один столбец в DataGridView и считать туда данные, причем, если авторов больше одного, добавить их через запятую в одну ячейку. Я конечно сейчас с этим разбираюсь, но все таки может есть готовые решения. Ну и плюс может знатоки по модели подскажут, может есть косячки. Спасибо!
Миниатюры
Правильная выгрузка данных в DataGridView  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2022, 09:48
Ответы с готовыми решениями:

Выгрузка данных из базы в dataGridView
Всем привет возникла такая проблема при выполнения запроса в dataGridView не всегда поступают данные... Хотя если использовать тужу...

Выгрузка данных из DataGridView в файл Word
Уважаемые программисты,прошу помощь( Пишу лабораторную работу, уже несколько дней мудохаюсь с ней:(( Нужно, по нажатии на кнопку,...

Выгрузка данных из Datagridview в документ
Здравствуйте подскажите есть Datagridview с загруженными данными, как привязать текстовые документы что бы данные при нажатии кнопки...

30
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
12.01.2022, 17:00  [ТС]
Студворк — интернет-сервис помощи студентам
AndreyVorobey, тогда на выходе я получаю одну какую то не понятную строку - это раз. Во вторых, у меня авторы не конкатенируются, как должны, то есть если будет '%ИМЯ4%', например, то выведет правильную книгу, но в строке авторов будет один автор, хотя их там 3. Привожу пример Вашего запроса(скриншот 1), и моего с использованием вложенного(скриншот 2).
То есть я получаю все айди книг, в которых есть данный автор, а после по этим айди вывожу эти книги уже в полном запросе.
Миниатюры
Правильная выгрузка данных в DataGridView   Правильная выгрузка данных в DataGridView  
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.01.2022, 17:10
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Если заметили, в catch стоит throw, и вызывающий метод будет прекрасно оповещен и возникшей проблеме.
Вырубите SQL-сервер, нажмите кнопку и посмотрите что получится
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,700
Записей в блоге: 4
12.01.2022, 17:48
Цитата Сообщение от MsGuns Посмотреть сообщение
Вырубите SQL-сервер, нажмите кнопку и посмотрите что получится
Timeout 30 секунд -> Exception -> Ошибка на экране, так как методы везде вызываются через await, и они не void, а Task.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
12.01.2022, 19:45
SQL
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
DROP TABLE IF EXISTS Books CASCADE;
DROP TABLE IF EXISTS Authors CASCADE;
DROP TABLE IF EXISTS Link_BA;
 
CREATE TABLE Books
(
    id serial,
    title CHARACTER VARYING(30) NOT NULL,
    YEAR INTEGER NOT NULL,
    PRIMARY KEY(Id)
);
 
CREATE TABLE Authors
(
    id serial,
    name CHARACTER VARYING(20) NOT NULL,
    surname CHARACTER VARYING(20) NOT NULL,
    PRIMARY KEY(Id)
);
 
CREATE TABLE Link_BA
(
    id serial,
    id_book INT NOT NULL,
    id_author INT NOT NULL,
    PRIMARY KEY(Id)
);
 
INSERT INTO Books (title, YEAR) VALUES ('Book 1', 1995);
INSERT INTO Books (title, YEAR) VALUES ('Book 2', 1996);
INSERT INTO Books (title, YEAR) VALUES ('Book 3', 1997);
INSERT INTO Books (title, YEAR) VALUES ('Book 4', 1998);
 
INSERT INTO Authors (name, surname) VALUES ('Author_name 1', 'Surname 1');
INSERT INTO Authors (name, surname) VALUES ('Author_name 2', 'Surname 2');
INSERT INTO Authors (name, surname) VALUES ('Author_name 3', 'Surname 3');
INSERT INTO Authors (name, surname) VALUES ('Author_name 4', 'Surname 4');
INSERT INTO Authors (name, surname) VALUES ('Author_name 5', 'Surname 5');
INSERT INTO Authors (name, surname) VALUES ('Author_name 6', 'Surname 6');
 
INSERT INTO Link_BA (id_book, id_author) VALUES (1, 1);
INSERT INTO Link_BA (id_book, id_author) VALUES (1, 2);
INSERT INTO Link_BA (id_book, id_author) VALUES (2, 3);
INSERT INTO Link_BA (id_book, id_author) VALUES (2, 4);
INSERT INTO Link_BA (id_book, id_author) VALUES (3, 5);
INSERT INTO Link_BA (id_book, id_author) VALUES (4, 6);
 
SELECT B.id,
       B.title,
       B.year,
       CONCAT( (
                     SELECT A.name || ' ' || A.surname
                     ), '; ') Authors
FROM Books AS B,
       Link_BA AS L,
       Authors AS A
WHERE L.id_book = B.id AND 
       A.id = L.id_author
Code
1
2
3
4
5
6
1   "Book 1"    1995    "Author_name 1 Surname 1; "
1   "Book 1"    1995    "Author_name 2 Surname 2; "
2   "Book 2"    1996    "Author_name 3 Surname 3; "
2   "Book 2"    1996    "Author_name 4 Surname 4; "
3   "Book 3"    1997    "Author_name 5 Surname 5; "
4   "Book 4"    1998    "Author_name 6 Surname 6; "
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.01.2022, 19:55
fakemade, Влом разбираться в Ваших SQL-этажерках, не видя всю базу и лишь догадываясь о связях.
Но, смею предположить, что у Вас есть таблица авторов + таблица книг + кросс-таблица книги-авторы.
В этом случае алгоритм выборки по автору таков:
1. Ищем автора в таблице авторов по like. Выбираем его id.
2. По id автора из кросс-таблицы выбираем все книги с этим автором.
3. По id найденных книг выбираем все авторов из той же кросс-таблицы, причем все авторы конкатенируются в одну строку.
Последнее в общий запрос не всунешь - придется писать UDF либо использовать временные таблицы в запросе/курсоры.

Вообще я бы советовал написать сразу UDF на выборку всех авторов по книгам. Сразу станет легче жить

Добавлено через 3 минуты
Цитата Сообщение от MsGuns Посмотреть сообщение
Последнее в общий запрос не всунешь
Не знаю лайт, но там, как и в MS SQL, такое вроде как сделать нельзя. В ORACLE можно (там есть массивы). Помнится, делал что-то подобное, но давно это было
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
13.01.2022, 04:46  [ТС]
wizard41, у вас выходит, что строка
Code
1
2
"Book 1"    1995    "Author_name 1 Surname 1; "
"Book 1"    1995    "Author_name 2 Surname 2; "
выводится два раза. В моем же случае (код выше в посте) выборкой для Book 1 будет одна строка, и она будет выглядеть примерно так:
Code
1
"Book 1"    1995    "Author_name 1 Surname 1; Author_name 2 Surname 2"
Возможно, здесь не хватает group by, хотя может я не прав.

MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
1. Ищем автора в таблице авторов по like. Выбираем его id.
2. По id автора из кросс-таблицы выбираем все книги с этим автором.
3. По id найденных книг выбираем все авторов из той же кросс-таблицы, причем все авторы конкатенируются в одну строку.
Последнее в общий запрос не всунешь - придется писать UDF либо использовать временные таблицы в запросе/курсоры.
Вот именно такой алгоритм реализует запрос, который я писал выше в посте. С помощью подзапроса
SQL
1
2
3
4
5
6
7
SELECT DISTINCT B.ID_OBJECT
                       FROM BOOK AS B,
                       LINK_BOOK_AUTHORS AS L,
                       AUTHOR AS A
                        WHERE L.ID_OBJECT = B.ID_OBJECT AND 
                        A.ID_AUTHOR = L.ID_AUTHOR AND 
                        A.NAME LIKE '%ИМЯ4%'
где последний параметр вариативный(я их в коде динамически добавляю в зависимости от заполненности поисковых полей), мы получаем список ID книг, в которые входит этот автор, после оператором IN проходимся по этой выборке и по ID книг выводим записи книг, которые нашлись. Все это вышел один запрос.

Добавлено через 19 минут
А, ну и вся схема базы представлена на скриншоте в первом посте
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.01.2022, 11:05
fakemade, я немного не доделал, потому что переключился на другую задачу.
Совершенно не важно как выглядят строки результата запросов - вы их не видите. Важно то, как их отображать в гриде. И для этого эти "этажи" вовсе ни к чему.

Добавлено через 1 минуту
Для сведения результатов из двух таблиц - тема на 26 постов! Вау
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
13.01.2022, 11:11  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Совершенно не важно как выглядят строки результата запросов - вы их не видите.
Почему же не важно, я как раз хочу получить строчку/строчки результата выборки именно в такой формате, чтобы в последней колонке был список авторов именно для данной книги, для чего как раз-таки помогает мне такой запрос. Может я не прав и можно проще, но пока это один рабочий способ.
Цитата Сообщение от wizard41 Посмотреть сообщение
Для сведения результатов из двух таблиц - тема на 26 постов! Вау
В споре рождается истина
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.01.2022, 11:15
Цитата Сообщение от fakemade Посмотреть сообщение
Почему же не важно
Еще раз - не важно. Перечитайте мой пост выше и подумайте еще раз.
Вы пытаетесь сразу в запросе получить необходимый формат. Можно, но муторно. Я могу запулить в строку грида хоть все данные целиком, из обычного запроса, который попадает в модель.
0
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186
13.01.2022, 12:19  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Вы пытаетесь сразу в запросе получить необходимый формат.
На мой взгляд это просто два разных подхода, каждый из которых имеет как плюсы, так и минусы. Я например, на данном этапе, имею бОльшие знания по СУБД, нежели по пространству имен System.Windows.Forms и мне проще получить уже форматированную строку и просто ее вывести, нежели крутить уже внутри приложухи выборку, чтобы правильно ее собрать. Это просто мое мнение на данный момент, возможно, когда-нибудь я преисполнюсь и буду делать правильно(если это не правильно) или решу, что для меня это правильней и буду так поступать всегда
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
13.01.2022, 12:31
Цитата Сообщение от fakemade Посмотреть сообщение
На мой взгляд это просто два разных подхода
Да, что-то вроде этого. Просто тут надо смотреть на целеполагание использования того или иного.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2022, 12:31

Правильная выгрузка dll
Доброго времени. Вопрос собственно в следующем, я подгружаю библиотеку которая в процессе работы формирует tlist из указателей. При...

Выгрузка данных из DataGridView в Excel и ошибка "Old format or invalid type library"
upp

Правильная сортировка в DataGridView
Здравствуйте! У меня есть много строк с подобными значениями: 100 / 666 0 / 321 5 / 6 14 / 886 113 / 966 ... При нажатии...

Правильная и производительная очистка DataGridView
У меня в приложении DataGridView связана через BindingSource с DataTable, которая через адаптер получает и обновляет данные в таблице базы...

Правильная валидация строк в DataGridView
Доброго времени суток, Господа. Не могу справиться с проблемой, которая тесно связана с DataBindingNavigator и DataGridView. Задача...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru