Модераторы: Rodman
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранение масива в поле БД? 
:(
    Опции темы
sono
Дата 10.5.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 10.1.2008
Где: KHARKOV

Репутация: нет
Всего: -1



Как записать в поле массив ?

Добавлено через 1 минуту и 37 секунд
Работаю с paradox или mdb.
PM MAIL   Вверх
Rodman
Дата 10.5.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Модератор
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



запиши в поле элементы массива через какой то разделитель..

Это сообщение отредактировал(а) Rodman - 10.5.2008, 16:17
PM MAIL WWW Skype GTalk YIM MSN   Вверх
sono
Дата 10.5.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 10.1.2008
Где: KHARKOV

Репутация: нет
Всего: -1



Что-то предчувствую мороку с  постоянной выгрузкой и загрузкой элементов масива  в поле даже при элементарной необходимости обращения к элементу масива - при рекомендуемой структуре(через разделитель). Может как-то проще ? 
Есть догадка, только незнаю как реализовать-а если создать тип: 
Код

type
  MatrixPtr = ^MatrixRec;
  MatrixRec = record
    MatrixRow   : byte;
    MatrixCol   : byte;
    MatrixArray : pointer;
  end;
  MatrixElement = real;
 
                     --взято из DRKB
вот только незнаю как теперь переменную этого типа всунуть в бд и в поле какого типа?

Добавлено через 7 минут и 37 секунд
а что если масив записатьв blob поле?

Добавлено через 9 минут и 29 секунд
только опять же - вечный вопрос как это сделать? 
PM MAIL   Вверх
Vas
Дата 12.5.2008, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 825
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Дык тут в струкруре указатель на массив, а не сам массив. Тип pointer 4 байта, так что можешь тупо писать в числовом варианте или строке в hex-формате, токи вопрос зачем указатель хранить в БД в каждом сеансе проги он может быть разным. А массив хранить, либо делай отдельную таблицу с id кому принадлежит массив и второе поле элементы массива. Либо делай как раньше сказали через разделитель.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
vovk
Дата 8.9.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



Можно в BLOB MEMO в каждой строке разместить элемент массива
PM MAIL   Вверх
pseud
Дата 10.9.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



sono, можно обойтись введением пары функций, которые использовать перед занесением массива в поле и при чтении массива из поля, например так:
Код

type
  TIntegerArray = array of Integer;

type
  TForm1 = class(TForm)
    Query1: TQuery;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function ArrayToString(a: TIntegerArray): string;
var
  i: Integer;
begin
  Result := '';
  for i := Low(a) to High(a) do
  begin
    if Result <> '' then
      Result := Result + ',';
    Result := Result + IntToStr(a[i]);
  end;
end;

function StringToArray(s: string): TIntegerArray;
begin
  // тут кода будет побольше
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TIntegerArray;
begin
  {
  наполнение массива <a>
  }
  with TQuery.Create(Self) do
  try
    SQL.Add('UPDATE table1 SET');
    SQL.Add('  fsArray = ' + QuotedStr(ArrayToString(a)));
    SQL.Add('WHERE id = 999');
    ExecSQL;
  finally
    Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TIntegerArray;
begin
  with TQuery.Create(Self) do
  try
    SQL.Add('SELECT * FROM table1 WHERE id = 999');
    Active := True;
    a := StringToArray(FieldByName('fsArray').AsString);
  finally
    Free;
  end;
end;


никакой мороки - кроме написания 2 толковых функций.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
pseud
Дата 10.9.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



по просьбе оргкомитета о доработке кода для FAQ, выкладываю полный код с комментариями и примером использования:
Код

type
  TIntegerArray = array of Integer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function ArrayToString(AIntegerArray: TIntegerArray): string;
var
  i: Integer;
begin
  Result := '';
  for i := Low(AIntegerArray) to High(AIntegerArray) do
  begin
    if Result <> '' then
      Result := Result + ',';
      // разделяем элементы строкового массива запятой.
      // впринципе как разделить можно использовать символ конца строки #13#10,
      // там даже парсить такю строку будет удобнее,
      // но тогда просмотр таблицы БД будет "изуродован".
    Result := Result + IntToStr(AIntegerArray[i]); // добавляем элемент строкового массива
  end;
end;

function StringToArray(AArrayStr: string): TIntegerArray;
var
  lstString: TStringList;
  i: Integer;
begin
  SetLength(Result, 0); // создаем массив
  lstString := TStringList.Create; // создаём класс "список строк"
  try
    lstString.Text := StringReplace(AArrayStr, ',', #13#10, [rfReplaceAll]); //заменяем все запятые на символы конца строки
    SetLength(Result, lstString.Count); // задаем размер массива
    for i := 0 to lstString.Count - 1 do
      Result[i] := StrToInt(lstString[i]); // заполняем элементы массива
  finally
    lstString.Free;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // проверка функций парсинга строки в массив и обратно
  ShowMessage(ArrayToString(StringToArray('1,2,3,4')));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TIntegerArray;
begin
  // пример сохранения массива в БД
  {
  ...
  наполнение массива <a>
  ...
  }
  with TQuery.Create(Self) do
  try
    SQL.Add('UPDATE table1 SET');
    SQL.Add('  fsArray = ' + QuotedStr(ArrayToString(a)));
    SQL.Add('WHERE id = 999');
    ExecSQL;
  finally
    Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TIntegerArray;
begin
  // пример чтения массива из БД
  with TQuery.Create(Self) do
  try
    SQL.Add('SELECT * FROM table1 WHERE id = 999');
    Active := True;
    a := StringToArray(FieldByName('fsArray').AsString);
  finally
    Free;
  end;
  {
  ...
  работа с массивом <a>
  ...
  }
end;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Google
  Дата 19.1.2019, 10:05 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.