![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Помогите правильно записать 3-х мерный массив в таблицу БД...
Итак есть массив var store:array[1..L,1..N,1..M] of Integer; Есть база и таблица такого типа: (1 основное поле - дата (день), 2 поле для хранения этого массива) ... Код:
with FieldDefs do
begin
Add('date',ftDate,0, True); // date
Add('tab',ftBytes, SizeOf(store)*4, False); // array data
end;[/b]Код:
with Form1.dt2 do
begin
Insert;
FieldByName('date').AsDateTime := Form1.dtp1.date ; // date
FieldByName('tab').Value[1] := store[1,1,1]; //array
Post;
endКак можно правильно записать массив (желательно без цикла, одним махом весь массив в БД) ??? Я также пробовал менять типа поля на ftARRAY но не знаю как с ним работать: Код:
...FieldByName('tab').AsArrayof Integer (??) := store[];Последний раз редактировалось Admin, 30.05.2013 в 09:50. |
|
#2
|
||||
|
||||
|
А нафик такой изврат? В плоскую структуру 3-х мерку запихивать?
Но пускай так надо. У вас тогда каждая ячейка должна содержать не элемент, а одномерный массив элементов, а таким макаром: Код:
FieldByName('tab').Value[1] := store[1,1,1]вы получаете плоскую 2-мерную табличку. |
|
#3
|
|||
|
|||
|
Цитата:
FieldByName('tab').Value := store; ? да и как правильно все таки задать поле для моего массива? LMN:=L*M*N; // размер массива в байтах Add('tab',ftBytes, LMN*4, False); // 4 байта на INTEGER или так? Add('tab',ftArray(?), LMN*4, False); // 4 байта на INTEGER |
|
#4
|
||||
|
||||
|
У вас целочисленные данные. Создайте поле типа Blob и запихивайте туда третью размерность потоком. Считывайте так-же.
|
|
#5
|
|||
|
|||
|
Цитата:
А можно пример как мой массив запихнуть в поток? Попробовал Stream := TMemoryStream.Create; BlobStream:= TABSBlobStream(CreateBlobStream(FieldByName('tab') ,bmWrite)); Но одни ошибки... ![]() |
|
#6
|
|||
|
|||
|
Цитата:
Я бы не спрашивал, но в интернете нету примеров Вернее там миллиард копий дебильного примера в котором Блоп записывается в файловый поток и читается оттуда. А мне это совершенно не надо, у меня единая БД - 1 файл. А вот как 3-х мерный массив засунуть в поток(память) и оттуда в Блоб в таблицу - таких примеров нигде не нашел... ![]() |
|
#7
|
||||
|
||||
|
Вот вам примерчик как это можно сделать. В примере для наглядности сделан 2-х мерный массив, но размерность не имеет значения.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBClient, StdCtrls, Grids, Mask, DBCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
ClientDataSet1id: TAutoIncField;
ClientDataSet1Date: TDateField;
ClientDataSet1ArrData: TBlobField;
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
StringGrid2: TStringGrid;
DBNavigator1: TDBNavigator;
DBEdit1: TDBEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientDataSet1AfterScroll(DataSet: TDataSet);
private
Arr3D: Array[1..10,1..10] of Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var x,y: Integer;
begin
for x := 1 to 10
do for y := 1 to 10
do begin
Arr3D[x,y] := Random(100);
StringGrid1.Cells[x-1,y-1] := IntToStr(Arr3D[x,y]);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
Var
Mem: TMemoryStream;
begin
Mem := TMemoryStream.Create;
Mem.Write(Arr3D, SizeOf(Arr3D));
Mem.Position := 0;
ClientDataset1.Append;
ClientDataset1.FieldByName('Date').AsDateTime := Now;
TBlobField(ClientDataset1.FieldByName('ArrData')).LoadFromStream(Mem);
ClientDataset1.Post;
Mem.Free;
end;
procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet);
Var x,y: Integer;
Mem: TMemoryStream;
begin
Mem := TMemoryStream.Create;
TBlobField(ClientDataset1.FieldByName('ArrData')).SaveToStream(Mem);
Mem.Position := 0;
Mem.Read(Arr3D, SizeOf(Arr3D));
for x := 1 to 10
do for y := 1 to 10
do begin
StringGrid2.Cells[x-1,y-1] := IntToStr(Arr3D[x,y]);
end;
Mem.Free;
end;
end. |