Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
28 / 20 / 10
Регистрация: 01.12.2018
Сообщений: 186

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

12.01.2022, 09:48. Показов 3464. Ответов 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
3386 / 2272 / 388
Регистрация: 14.08.2018
Сообщений: 7,689
Записей в блоге: 4
12.01.2022, 17:48
Цитата Сообщение от MsGuns Посмотреть сообщение
Вырубите SQL-сервер, нажмите кнопку и посмотрите что получится
Timeout 30 секунд -> Exception -> Ошибка на экране, так как методы везде вызываются через await, и они не void, а Task.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 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
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 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
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 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
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru