Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Программист по неволе
 Аватар для Alex_From_777
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
MS Access

Прочитать массив строк из БД через SQL запрос Select

29.03.2018, 21:06. Показов 1901. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Помогите, пожалуйста, решить следующую проблему.
Да и прошу, сильно не бейте.
Некоторое время назад необходимо было организовать прочтение из БД некоторого количества записей и их значения присвоить элементам некоторого массива. Что бы сделать это и показать работающим времени было мало, поэтому сделал я это так, ну какая первая мысль на эту тему пришла в голову, собственно я так и сделал.
Вот как оно было реализовано. Я точно знал, что значения ноль, ну т.е. "0", точнее записи с нулем в данном поле быть не может по умолчанию. Так что я когда создавал эту БД искуственно ввел туда значение 0 последним, а в дальнешем проверял по этому значению, не закончились ли записи в БД:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
String frqStr[50];
int i=0;
do
{
  ADOQuery1->Close();
  ADOQuery1->SQL->Clear();
  ADOQuery1->SQL->Add("SELECT freq FROM [Device2]");
  ADOQuery1->Open();
    frqStr[i]=ADOQuery1->FieldByName("freq")->AsString;
  ADOQuery1->Close();
  i++;  
}
while (frqStr!="0");
И да, я этот ноль как текст хранил.

На тот момент это было норм, но я стал искать варианты как реализовать это иначе.
И я сделал реализацию следующим образом.
По полю Код, которое создается автоматически в Access при создании таблицы, точнее записям в поле код я провожу цикл,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  int i, stop;
  ADOQuery1->Close();
  ADOQuery1->SQL->Clear();
  ADOQuery1->SQL->Add("SELECT COUNT(*) AS resultsqlint FROM [Device2]"); 
  ADOQuery1->Open();
  stop = ADOQuery1->FieldByName("resultsqlint")->AsInteger;
 
  i=1;
  do
  {
     ADOQuery1->Close();
     ADOQuery1->SQL->Clear();
     ADOQuery1->SQL->Add("SELECT freq FROM [Device2] WHERE Код="+i+"");
     ADOQuery1->Open();
       frqStr[i]=ADOQuery1->FieldByName("freq")->AsString;
     ADOQuery1->Close();
     i++;
  }
  while (i<=stop);
Есть в этом варианте одна сложность, если удалить запись, а потом внести новую, то поле Код продолжит нумировать их с удаленного значения, т.е. пусть было 5 записей, одну удалили, их стало 4, внесли новую, но она теперь идет под номером 6. Так что цикл по полю Код не очень хорош. Хотел создать свой собственный счетчик, который я буду обновлять при удалении записей. Количество записей для каждой из таблиц планировалось хранить в файле. Т.е. открыл программу- прочитал файл, узнал количество записей в таблице. Удалил одну из них программно, значит далее переписал все поле нового счетчика и в нем изменения в файл.

Но уверен есть некоторый более оптимальный способ решения данной задачи. Поэтому прошу помощи.
Буду рад любой помощи по этому вопросу.

Добавлено через 8 часов 46 минут
Неужели никто не может помочь?
Народ, наверняка у Вас то же были подобные задачи. Может при это вы другие СУБД использовали, но идея должна быть единой.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2018, 21:06
Ответы с готовыми решениями:

Функция которая формирует тег <select> с <option> через массив строк
Не в курю, если есть у кого пример, буду признателен, сам точно сегодня не зделаю

Запрос Select T-sql - Вложенный запрос вернул больше одного значения
Нужно посчитать комиссию от сделки. DealShare(комиссия) - поле таблицы agents, supplies - предложения(риелторы клиентам) deals-...

Запрос SQL SELECT
Приветствую! Схема БД состоит из четырех таблиц: Product(maker, model, type) PC(code, model, speed, ram, hd, cd, price) ...

8
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.03.2018, 23:15
Не совсем понятна логика действий. Если надо занести данные с поля в массив, то просто делается запрос, а потом в цикле делается пробег по строкам с проверкой на нулевое значение в строке. Если я конечно правильно понял..........
1
Программист по неволе
 Аватар для Alex_From_777
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
29.03.2018, 23:20  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
строкам
По строкам в таблице БД?
Если да, то вроде как второй вариант у меня так же работает.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.03.2018, 23:34
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
Если да, то вроде как второй вариант у меня так же работает.
В цикле использовать запрос это не совсем правильно.
1
Программист по неволе
 Аватар для Alex_From_777
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
29.03.2018, 23:39  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
В цикле использовать запрос это не совсем правильно.
Тогда не совсем понятно как...
Вот создал я запрос:
C++
1
  ADOQuery1->SQL->Add("SELECT freq FROM [Device2]");
Резалт сетом у меня будут все записи. А вот как циклом пройтись по этому резалт сету не совсем понятно.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.03.2018, 23:41
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
резалт сету не совсем понятно
Что конкретно не понятно?
1
Программист по неволе
 Аватар для Alex_From_777
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
29.03.2018, 23:51  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
Что конкретно не понятно?
Допустим я сделаю еще запрос Select Count и узнаю сколько всего было записей в таблице. Теперь я знаю, от и до какого значения мне циклом проходить.
Но к чему мне теперь обращаться, что бы
Ну вот если бы мне нужно было бы брать значения не из БД, а из компонента StringGrid, то я бы писал что-то типа:
C++
1
2
3
4
5
String strArray[50];
for (int i=0; i<StringGrid1->RowCount; i++)
{
   strArray[i]=StringGrid1->Cells[0][i];
}
сейчас выражусь очень неккоректно может быть, но думаю так будет понятно, что я не догоняю: моим StringGrid1->Cells[0][i] в данном случае что будет?
0
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
30.03.2018, 01:45
C++
1
2
3
4
5
6
7
//Запрос.
 
for (int i = 0; i < ADOQuery->RecordCount; i++)
{
      frqStr[i] = ADOQuery->FieldByName("freq")->AsString;
      ADOQuery->Next();
}
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
30.03.2018, 01:47
C++
1
2
3
4
5
6
7
8
9
10
11
     ADOQuery1->Close();
     ADOQuery1->SQL->Clear();
     ADOQuery1->SQL->Text="SELECT freq FROM [Device2] WHERE Код=";//тут какое-то значение условия
     ADOQuery1->Open();
//в результате получим выборку
   ADOQuery1->First();
    for(int i=0; i<ADOQuery->RecordCount; i++)
  {
      // чего-нибудь делаем с выборкой
      ADOQuery1->Next();
  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2018, 01:47
Помогаю со студенческими работами здесь

SQL запрос SELECT
Добрый день. Есть 2 вопроса. База в Access с одной таблицей. 1) Есть числовое поле по которому нужно сделать необычную выборку: ...

запрос SQL insert....select...where
Доброго времени суток! Есть две таблицы Orderlist и tmp_profile. tmp_profile состоит из некоторых отобранных строчек таблицы Orderlist....

Сложный SQL запрос SELECT
сложный SQL запрос SELECT создать запрос, который будет возвращать : имя, фамилию, начальники фамилию, отдел, к которому они...

Не правильно работает sql select запрос
Мой запрос выводит всего 1 поле, а их несколько. Тот же запрос в phpmyadmin выдает правильную информацию. $connect =...

Не работает SQL-запрос SELECT и SqlDataReader
Всем привет, проблема в следующем: Мне нужно получить 1 значение из БД, но ридер тупо не хочет читать, перепробовал много вариантов, вот...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru