C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Результаты запроса
** Stas
Отправлено: 31.03.2004, 12:48


Не зарегистрирован







Выполняется запрос к БД (InterBase) , надо результаты этого запроса
напрямую сохранить в строковый массив, как такое реализовать?
Заранее спасибо.
olegenty
Отправлено: 31.03.2004, 14:04


Ветеран

Группа: Модератор
Сообщений: 2412



в строковый массив — именно массив строк?

вариант 1:
CODE

typedef DynamicArray< DynamicArray < AnsiString > > T2DStringArray;

void __fastcall FillArray(T2DStringArray &a)
{
   Query->Open();
   if (!Query->Eof)
   {
       SetLength(s_array, количество_записей); // либо ты его через отдельный запрос с Count получишь, либо — как-то ещё.
       int i = 0;
       while (!Query->Eof)
       {
            SetLength(a[i], количество_полей запроса);
            a[i, номер_поля] = Query->FieldByName("Имя поля")-AsString;
            a[i, номер_поля] = Query->FieldByName("Имя поля")-AsString;
            ...
            i++;
            Query->Next();
       }
   }
}


вариант 2 я не буду описывать так подробно, но суть — пользоваться TStringList c разделителем полей. нудно.

вариант 3 — породить TList, в котором хранить одномерные DynamicArray . У такого метода есть преимущество: не нужно заранее знать количество записей.
** Stas
Отправлено: 31.03.2004, 18:06


Не зарегистрирован







Ну мне надо получить просто доступ к каждой ячейке результата запроса и вывести их на форме в разных местах.
Ну вот я для этого и хотел сначало использовать массив.

Может есть более рациональных подход?
olegenty
Отправлено: 01.04.2004, 06:54


Ветеран

Группа: Модератор
Сообщений: 2412



TClientDataSet можно использовать. Он умеет жить и без физического соединения с источником данных.
** Stas
Отправлено: 01.04.2004, 09:52


Не зарегистрирован







А где можно посмотреть как он работает? или может исходник есть
** Stas
Отправлено: 01.04.2004, 09:52


Не зарегистрирован







А где можно посмотреть как он работает? или может исходник есть
olegenty
Отправлено: 01.04.2004, 10:34


Ветеран

Группа: Модератор
Сообщений: 2412



DFM:
CODE

object Form1: TForm1
 Left = 192
 Top = 138
 Width = 696
 Height = 480
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object DBGrid1: TDBGrid
   Left = 0
   Top = 0
   Width = 688
   Height = 453
   Align = alClient
   DataSource = ds
   TabOrder = 0
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = 'MS Sans Serif'
   TitleFont.Style = []
 end
 object db: TIBDatabase
   Connected = True
   DatabaseName = 'S-NUA:d:\pdb\appdb.2.4.6.1.gdb'
   Params.Strings = (
     'user_name=SYSDBA'
     'password=masterkey'
     'lc_ctype=WIN1251')
   LoginPrompt = False
   IdleTimer = 0
   SQLDialect = 3
   TraceFlags = []
   Left = 52
   Top = 48
 end
 object q: TIBQuery
   Database = db
   Transaction = t
   BufferChunks = 1000
   CachedUpdates = False
   SQL.Strings = (
     
       'select R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION, R.RDB$FIELD_NA' +
       'ME, '
     
       'F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE, F.RDB$F' +
       'IELD_SUB_TYPE '
     'from RDB$FIELDS F, RDB$RELATION_FIELDS R '
     
       'where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLA' +
       'G = 0 '
     'order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION '
     '')
   Left = 84
   Top = 48
   object qRDBRELATION_NAME: TIBStringField
     FieldName = 'RDB$RELATION_NAME'
     Origin = 'RDB$RELATION_FIELDS.RDB$RELATION_NAME'
     FixedChar = True
     Size = 31
   end
   object qRDBFIELD_POSITION: TSmallintField
     FieldName = 'RDB$FIELD_POSITION'
     Origin = 'RDB$RELATION_FIELDS.RDB$FIELD_POSITION'
   end
   object qRDBFIELD_NAME: TIBStringField
     FieldName = 'RDB$FIELD_NAME'
     Origin = 'RDB$RELATION_FIELDS.RDB$FIELD_NAME'
     FixedChar = True
     Size = 31
   end
   object qRDBFIELD_LENGTH: TSmallintField
     FieldName = 'RDB$FIELD_LENGTH'
     Origin = 'RDB$FIELDS.RDB$FIELD_LENGTH'
   end
   object qRDBFIELD_TYPE: TSmallintField
     FieldName = 'RDB$FIELD_TYPE'
     Origin = 'RDB$FIELDS.RDB$FIELD_TYPE'
   end
   object qRDBFIELD_SCALE: TSmallintField
     FieldName = 'RDB$FIELD_SCALE'
     Origin = 'RDB$FIELDS.RDB$FIELD_SCALE'
   end
   object qRDBFIELD_SUB_TYPE: TSmallintField
     FieldName = 'RDB$FIELD_SUB_TYPE'
     Origin = 'RDB$FIELDS.RDB$FIELD_SUB_TYPE'
   end
 end
 object t: TIBTransaction
   Active = True
   DefaultDatabase = db
   Params.Strings = (
     'read'
     'read_committed'
     'rec_version'
     'nowait')
   AutoStopAction = saNone
   Left = 52
   Top = 80
 end
 object ds: TDataSource
   DataSet = c
   Left = 84
   Top = 80
 end
 object c: TClientDataSet
   Aggregates = <>
   Params = <>
   Left = 117
   Top = 48
   object cRDBRELATION_NAME: TStringField
     FieldName = 'RDB$RELATION_NAME'
     FixedChar = True
     Size = 31
   end
   object cRDBFIELD_POSITION: TSmallintField
     FieldName = 'RDB$FIELD_POSITION'
   end
   object cRDBFIELD_NAME: TStringField
     FieldName = 'RDB$FIELD_NAME'
     FixedChar = True
     Size = 31
   end
   object cRDBFIELD_LENGTH: TSmallintField
     FieldName = 'RDB$FIELD_LENGTH'
   end
   object cRDBFIELD_TYPE: TSmallintField
     FieldName = 'RDB$FIELD_TYPE'
   end
   object cRDBFIELD_SCALE: TSmallintField
     FieldName = 'RDB$FIELD_SCALE'
   end
   object cRDBFIELD_SUB_TYPE: TSmallintField
     FieldName = 'RDB$FIELD_SUB_TYPE'
   end
 end
end

заголовочный файл
CODE

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <DB.hpp>
#include <DBClient.hpp>
#include <DBGrids.hpp>
#include <Grids.hpp>
#include <IBCustomDataSet.hpp>
#include <IBDatabase.hpp>
#include <IBQuery.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
   TIBDatabase *db;
   TIBQuery *q;
   TIBTransaction *t;
   TDataSource *ds;
   TDBGrid *DBGrid1;
   TClientDataSet *c;
   TIBStringField *qRDBRELATION_NAME;
   TSmallintField *qRDBFIELD_POSITION;
   TIBStringField *qRDBFIELD_NAME;
   TSmallintField *qRDBFIELD_LENGTH;
   TSmallintField *qRDBFIELD_TYPE;
   TSmallintField *qRDBFIELD_SCALE;
   TSmallintField *qRDBFIELD_SUB_TYPE;
   TStringField *cRDBRELATION_NAME;
   TSmallintField *cRDBFIELD_POSITION;
   TStringField *cRDBFIELD_NAME;
   TSmallintField *cRDBFIELD_LENGTH;
   TSmallintField *cRDBFIELD_TYPE;
   TSmallintField *cRDBFIELD_SCALE;
   TSmallintField *cRDBFIELD_SUB_TYPE;
   void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public:  // User declarations
   __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

исходник
CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   db->Open();
   q->Open();
   c->CreateDataSet();
   while (!q->Eof)
   {
       c->InsertRecord(ARRAYOFCONST((qRDBRELATION_NAME->AsString,
                                     qRDBFIELD_POSITION->AsInteger,
                                     qRDBFIELD_NAME->AsString,
                                     qRDBFIELD_LENGTH->AsInteger,
                                     qRDBFIELD_TYPE->AsInteger,
                                     qRDBFIELD_SCALE->AsInteger,
                                     qRDBFIELD_SUB_TYPE->AsInteger)));
       q->Next();
   }
}
//---------------------------------------------------------------------------


Протестировал. Работает.
olegenty
Отправлено: 01.04.2004, 10:37


Ветеран

Группа: Модератор
Сообщений: 2412



Запрос построен к системной таблице, просто смени путь до своей БД.
Admin
Отправлено: 03.04.2004, 17:43


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE
Ну мне надо получить просто доступ к каждой ячейке результата запроса и вывести их на форме в разных местах.


А не проще использовать для этого DBText, DBMemo, DBEdit, DBImage
и др соответствующие компоненты (или DBGrid, DBCtrlGrid) ?
Bubble
Отправлено: 19.04.2004, 00:39


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE (** Stas @ 31/03/2004, 19:08)
Ну мне надо получить просто доступ к каждой ячейке результата запроса и вывести их на форме в разных местах.
Ну вот я для этого и хотел сначало использовать массив.
Может есть более рациональных подход?

Ну если уж совсем руками, что мешает написать:

AnsiString a;
a=Table->FieldByName("ИМЯ_ПОЛЯ")->AsString;

Далее это a пихаем куда надо, например в TEDIT:
Edit1->Text=a;

Предполагаем, что TTable уже спозиционирован куда надо.

Вернуться в Работа с базами данных в C++Builder