|
|
Регистрация | << Правила форума >> | 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. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |