** 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 уже спозиционирован куда надо.
|
|