Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2015, 19:37   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Delphi + sql

И снова здравствуй, форум. Мне нужна твоя помощь.

Описываю ситуацию.
1. Что мы имеем в делфи:

Код:
ArrayData: Variant;
RowCount, ColCount: Integer;

  // Размеры выводимого массива данных

  RowCount := 1;
  ColCount := 9;

  // заполняем массив
  for i := 1 to RowCount do
    for j := 1 to ColCount do
      ArrayData[i, j] := 'значение';
2. SQL
Таблица (жирным выделил шапку, для наглядности):

A b c d e f g h i

1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3

Что мне нужно? Мне необходимо, результат запроса "SELECT * FROM table" перенести в мой массив. В интернете поискал, попробовал предлагаемые - не получилось. Может конечно руки кривые, но тем не менее. Рассчитываю на Вашу помощь. Заранее благодарю.
nactyx вне форума Ответить с цитированием
Старый 05.03.2015, 20:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А можно пробы увидеть? Хотя бы чтоб знать что советовть. А то ведь можно такого напредлагать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.03.2015, 22:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

примерно так:
Код:
var
  ArrayData: array of array of Integer;
  i, j : integer;
begin

  ADOQuery1.Close;
  ADOQuery1.SQL.Text := 'SELECT * From ВашаТаблица';
  ADOQuery1.Open;
  
  if ADOQuery1.RecordCount=0 then ShowMessage('Нет записей в таблице')
  else begin
    SetLength(ArrayData, ADOQuery1.RecordCount, ADOQuery1.FieldCount);
    for i:=0 to ADOQuery1.RecordCount-1 do begin
      for  j:=0 to ADOQuery1.FieldCount-1 do
         ArrayData[i,j] := ADOQuery1.Fields[j].AsInteger;
      ADOQuery1.Next;
    end;
  end;

  ADOQuery1.Close; 
....
p.s. ну, можно и Variant использовать. Тогда нужно вместо SetLength использовать VarArrayCreate с нужными параметрами...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.03.2015, 07:39   #4
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А можно пробы увидеть? Хотя бы чтоб знать что советовть. А то ведь можно такого напредлагать...
А что подразумевается под пробами? Примеры моих попыток?


Serge_Bliznykov, доберусь до работы и попробую, спасибо!
nactyx вне форума Ответить с цитированием
Старый 06.03.2015, 07:40   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ADOQuery1.RecordCount
А вот с этим я бы был поаккуратнее.
Цитата:
что подразумевается под пробами? Примеры моих попыток?
Ну а что же еще? )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.03.2015, 10:03   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Цитата:
Код:
ADOQuery1.RecordCount
А вот с этим я бы был поаккуратнее.
Да, согласен, RecordCount не всегда ведёт себя адекватно.
Но, в качестве начальной отправной точки вполне можно попробовать. А дальше уже надо смотреть.
Например, можно железобетонный цикл замутить вида:
Код:
ADOQuery1.Open;
while not ADOQuery1.EOF do begin
   <делаем что надо>
   ADOQuery1.Next; // переходим к следующей записи в наборе данных
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.03.2015, 13:35   #7
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Сделал я вот так:

Код:
ArrayData: Variant;

  ADOQuery1.Close;
  ADOQuery1.SQL.Text := 'SELECT * FROM dbo.test';
  ADOQuery1.Open;

  if ADOQuery1.RecordCount = 0 then ShowMessage('Нет записей в таблице')
  else begin
    ArrayData := VarArrayCreate([0, ADOQuery1.RecordCount, 0, ADOQuery1.FieldCount], varVariant);
    for i := 0 to ADOQuery1.RecordCount - 1 do begin
      for  j := 0 to ADOQuery1.FieldCount - 1 do
         ArrayData[i, j] := ADOQuery1.Fields[j].AsInteger;
      ADOQuery1.Next;
    end;
  end;

  ADOQuery1.Close;
И получил именно то, что хотел. Огромное Вам спасибо!
nactyx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
Delphi и MS SQL rainbow БД в Delphi 4 24.09.2009 11:17
SQL в Delphi Nomad Помощь студентам 15 12.12.2007 09:50