Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153

DBComboBox и база данных

18.05.2012, 10:02. Показов 2873. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте все!

У меня проблемы с кодом реализации нужных действий, поэтому прошу вашей помощи:
Есть 3 DBComboBox'а и есть база данных состоящая из 3-х таблиц. Я пытаюсь вывести в каждый DBComboBox по столбцу из кажддой таблицы.
Из поиска по форуму я понял, что это делается с помощью цикла и запроса. Первоначально в моем вариенте это было так:
C++
1
2
3
4
5
6
7
8
9
10
11
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name1 AS Исполнители, Name2 AS Диски, Name3 AS Песни");
Query1->SQL->Add("FROM performer P, album A, song S");
Query1->SQL->Add("WHERE A.perf_id = P.id AND A.id = S.alb_id");
Query1->Open();
while (!Query1->Eof)
  {
  DBComboBox1->Items->Add(Query1->FieldByName("Исполнители")->AsString);
  DBComboBox2->Items->Add(Query1->FieldByName("Диски")->AsString);
  DBComboBox3->Items->Add(Query1->FieldByName("Песни")->AsString);
  Query1->Next();
Примечание
В каждом DBComboBox'е связи были настроены и в DataField были назначены свои столбцы на каждый DBComboBox.

Все работало, однако выводимые записи в DBComboBox'е повторяли порядок в DBGird'е (см.рис.).
Было ясно что это связано с запросом, поэтому пришлось написать для каждого отдельно:
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
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name1 AS Исполнители");
Query1->SQL->Add("FROM performer");
DBComboBox1->DataField = "Исполнители";
Query1->Open();
while (!Query1->Eof)
  {
  DBComboBox1->Items->Add(Query1->FieldByName("Исполнители")->AsString);
  Query1->Next();
  }
 
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name2 AS Диски");
Query1->SQL->Add("FROM album");
DBComboBox2->DataField = "Диски";
Query1->Open();
while (!Query1->Eof)
  {
  DBComboBox2->Items->Add(Query1->FieldByName("Диски")->AsString);
  Query1->Next();
  }
 
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name3 AS Песни");
Query1->SQL->Add("FROM song");
DBComboBox3->DataField = "Песни";
Query1->Open();
while (!Query1->Eof)
  {
  DBComboBox3->Items->Add(Query1->FieldByName("Песни")->AsString);
  Query1->Next();
  }
Однако при компилировании программа начинает ругаться, что чего то не нашел:
Project Project1.exe raised exception class EDatabaseError with message 'DBComboBox3: Field 'Песни' not found'. Process stopped. Use Step or Run to continue.
И это сообщение все время варьируется между различными DBComboBox'ами и соответственно Field'ом

П.С. хочу сразу отсечь вопросы типа "почему DBComboBox, а не DBLookupComboBox и т.д.". Мне нужен свободный ввод новых записей, т.к. собираюсь их использовать как добавление, редактирование и удаление записей баз данных.
Миниатюры
DBComboBox и база данных  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2012, 10:02
Ответы с готовыми решениями:

Borland C++ Builder 6 DBComboBox Связь с БД и Другими DBComboBox
есть такая форма) мне нужно что б при выборе данные в одном DBComboBox в других в зависимости от выбора в первом выводились данные)...

Ввод данных в ячейку из DBComboBox
Имеется записи в Item, но никак не могу сделать, там что выбираешь запись из раскрывающего списка, а она появляется в ячейку. Возможно...

База данных и Delphi 7. DBComboBox
Здравствуйте. Такая вот ситуация, имеется база данных MO Access и Delphi 7. В базе данных имеется 5 таблиц, все соединены между собой по...

7
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
18.05.2012, 10:22
Mesken,
Цитата Сообщение от Mesken Посмотреть сообщение
хочу сразу отсечь вопросы типа "почему DBComboBox, а не DBLookupComboBox и т.д."
У меня же будет вопрос другой: почему не использовать обычный ComboBox?


Цитата Сообщение от Mesken Посмотреть сообщение
Все работало, однако выводимые записи в DBComboBox'е повторяли порядок в DBGird'е
Ну а в Вашем случае надо использовать DISTINCT в запросе (в верхнем коде).

Добавлено через 2 минуты
Пардон, все нормально Не увидел "performer P, album A"
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
18.05.2012, 11:19  [ТС]
The_Immortal,
У меня же будет вопрос другой: почему не использовать обычный ComboBox?
Можно и его, главное чтоб потом можно было удобно использовать в последующих действиях: добавить, удалить и редактировать
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
18.05.2012, 11:22
В общем так:
1) В первом случае Вы используете DBComboBox как обычный ComboBox. В связи с этим у меня и возник вопрос:
Цитата Сообщение от The_Immortal Посмотреть сообщение
почему не использовать обычный ComboBox?
+ используйте DISTINCT в запросе если хотите добиться уникальности.

2) Либо если делать выборку из разных таблиц и использовать при этом DBComboBox, то перед указанием
Цитата Сообщение от Mesken Посмотреть сообщение
C++
1
DBComboBox1->DataField = "Исполнители";
(к примеру) необходимо указывать DataSource - т.е. тот ДатаСоурс, который привязан к набору данных (Query1)

Добавлено через 1 минуту
Цитата Сообщение от Mesken Посмотреть сообщение
Можно и его, главное чтоб потом можно было удобно использовать в последующих действиях: добавить, удалить и редактировать
Где? Через эти Боксы?
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
18.05.2012, 13:52  [ТС]
The_Immortal, вы были правы, лучше использовать обычный ComboBox.

И еще, у меня маленький вопросик:
можно ли ниже предложенный код запихнуть в какой-нибудь цикл, чтоб меньше строк занимала?
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
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name1");
Query1->SQL->Add("FROM performer");
Query1->Open();
while (!Query1->Eof)
  {
  ComboBox1->Items->Add(Query1->FieldByName("Name1")->AsString);
  Query1->Next();
  }
 
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name2");
Query1->SQL->Add("FROM album");
Query1->Open();
while (!Query1->Eof)
  {
  ComboBox2->Items->Add(Query1->FieldByName("Name2")->AsString);
  Query1->Next();
  }
 
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT Name3");
Query1->SQL->Add("FROM song");
Query1->Open();
while (!Query1->Eof)
  {
  ComboBox3->Items->Add(Query1->FieldByName("Name3")->AsString);
  Query1->Next();
  }
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
18.05.2012, 14:15
Mesken, насчет цикла не знаю... Но сократить кол-во строчек предлагаю так:

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
void select (String sql) // создаем функцию 
{
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add(sql);
Query1->Open();
}
 
//тогда в теле будет так:
select ("SELECT Name1 FROM performer");
while (!Query1->Eof)
  {
  ComboBox1->Items->Add(Query1->FieldByName("Name1")->AsString);
  Query1->Next();
  }
 
select ("SELECT Name2 FROM album");
while (!Query1->Eof)
  {
  ComboBox2->Items->Add(Query1->FieldByName("Name2")->AsString);
  Query1->Next();
  }
 
select ("SELECT Name3 FROM song");
while (!Query1->Eof)
  {
  ComboBox3->Items->Add(Query1->FieldByName("Name3")->AsString);
  Query1->Next();
  }
А, ну еще можно загнать все это в
C++
1
2
3
4
for (int i=1; i<4; i++)
{
// и брать везде ... + "Name" + IntToStr(i) + ...
}
Ну надеюсь суть поняли.
И еще юзать функцию FindComponent для индексации ComboBox =)

Добавлено через 8 минут
Дык или вообще один запрос построить (чет я туплю):

"SELECT p.Name1, a.Name2, s.Name3 FROM performer p, album a, song s".

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
select ("SELECT p.Name1, a.Name2, s.Name3 FROM performer p, album a, song s");
while (!Query1->Eof)
  {
  ComboBox1->Items->Add(Query1->FieldByName("Name1")->AsString);
  ComboBox2->Items->Add(Query1->FieldByName("Name2")->AsString);
  ComboBox3->Items->Add(Query1->FieldByName("Name3")->AsString);
  Query1->Next();
  }
Устроит?
1
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
18.05.2012, 14:40  [ТС]
The_Immortal, насчет создании функции спасибо, хорошая идея.
А вот с общим запросом работать как надо не будет.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
18.05.2012, 14:52
Mesken,
Цитата Сообщение от Mesken Посмотреть сообщение
А вот с общим запросом работать как надо не будет.
Почему?

Добавлено через 5 минут
Ах да, кол-во записей-то разное... Не додумал я, сорри.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2012, 14:52
Помогаю со студенческими работами здесь

Связь DBComboBox и DBGrid - в DBComboBox только одна запись
Всем привет) я сделала связь DBComboBox и DBGrid. Но почему то у меня в DBComboBox появилась только 1 запись а остальных нет((помогите...

Отображение данных в DBCombobox
Из выпадающего списка DBCombobox выбираю значение, а оно исчезает. Так же и с DBедит, ставлю курсор пытаюсь, что-нибудь написать, а он не...

Выбор данных из DBCombobox
Здравствуйте. Помогите пожалуйста разобраться) На первой форме есть DBCombobox1 в нем отображаются все НАЗВАНИЯ журналов спортивных...

База данных, основанная на службах vs База данных SQL Server
Доброго времени суток. Делал я, значит, Data Access Layer для ASP.NET MVC проекта. Создал обычную библиотеку классов, моделей туда...

Выбор данных через DBComboBox
Подключил я базу к DBComboBox. Но выводит только одну запись. В самой базе около 10 записей, но выводит только одну. Как мне сделать, чтобы...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru