Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.05.2013, 09:44
djjag djjag вне форума
Прохожий
 
Регистрация: 30.05.2013
Сообщения: 5
Версия Delphi: Delphi 7 lite
Репутация: 10
Вопрос Трехмерный массив в таблице БД

Помогите правильно записать 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  
Старый 30.05.2013, 13:09
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А нафик такой изврат? В плоскую структуру 3-х мерку запихивать?
Но пускай так надо. У вас тогда каждая ячейка должна содержать не элемент, а одномерный массив элементов, а таким макаром:
Код:
FieldByName('tab').Value[1] := store[1,1,1]

вы получаете плоскую 2-мерную табличку.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 30.05.2013, 13:38
djjag djjag вне форума
Прохожий
 
Регистрация: 30.05.2013
Сообщения: 5
Версия Delphi: Delphi 7 lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
А нафик такой изврат? В плоскую структуру 3-х мерку запихивать?
Но пускай так надо. У вас тогда каждая ячейка должна содержать не элемент, а одномерный массив элементов, а таким макаром:
Код:
FieldByName('tab').Value[1] := store[1,1,1]

вы получаете плоскую 2-мерную табличку.
Да но как это сделать?
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  
Старый 30.05.2013, 13:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

У вас целочисленные данные. Создайте поле типа Blob и запихивайте туда третью размерность потоком. Считывайте так-же.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 30.05.2013, 16:25
djjag djjag вне форума
Прохожий
 
Регистрация: 30.05.2013
Сообщения: 5
Версия Delphi: Delphi 7 lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
У вас целочисленные данные. Создайте поле типа Blob и запихивайте туда третью размерность потоком. Считывайте так-же.

А можно пример как мой массив запихнуть в поток?
Попробовал
Stream := TMemoryStream.Create;
BlobStream:= TABSBlobStream(CreateBlobStream(FieldByName('tab') ,bmWrite));

Но одни ошибки...
Ответить с цитированием
  #6  
Старый 31.05.2013, 09:06
djjag djjag вне форума
Прохожий
 
Регистрация: 30.05.2013
Сообщения: 5
Версия Delphi: Delphi 7 lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от djjag
А можно пример как мой массив запихнуть в поток?
Попробовал
Stream := TMemoryStream.Create;
BlobStream:= TABSBlobStream(CreateBlobStream(FieldByName('tab') ,bmWrite));

Но одни ошибки...

Я бы не спрашивал, но в интернете нету примеров
Вернее там миллиард копий дебильного примера в котором Блоп записывается в файловый поток и читается оттуда. А мне это совершенно не надо, у меня единая БД - 1 файл.
А вот как 3-х мерный массив засунуть в поток(память) и оттуда в Блоб в таблицу - таких примеров нигде не нашел...
Ответить с цитированием
  #7  
Старый 31.05.2013, 13:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вот вам примерчик как это можно сделать. В примере для наглядности сделан 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.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter