отображение TEXT LONGTEXT полей (MySQL) в Lazarus

Вопросы программирования и использования среды Lazarus.

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

отображение TEXT LONGTEXT полей (MySQL) в Lazarus

Сообщение abench » 17.04.2007 20:50:06

Базы данных MySQL поддерживають поля типа TEXT LONGTEXT. Как их отобразить средствами Lazarus? Ведь ни TDbGrid TDbMemo такие поля не отображают. Мало того, даже упоминание о полях этого типа отсутствует в результатах запросов - на запрос типа "select * from table" в свойствах
fields компонента TSQLQuery вы не найдете полей типа TEXT LONGTEXT. Подскажите решение для отображения и доступа к таким полям.
abench
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.04.2007 20:21:28

Сообщение Attid » 18.04.2007 01:13:01

я бы продположил что обращение к ним идет как к текстовым блобам.
по крайней мере попробывал так =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение abench » 18.04.2007 11:51:52

Attid писал(а):я бы продположил что обращение к ним идет как к текстовым блобам.
по крайней мере попробывал так =)


А где найти информацию по работе с текстовыми блобами? Я пробовал експериментировать с методом CreateBlobSteram. Пока ничего не получилось

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var fl:TField;
    st:TStream;
begin
  fl:=TField.Create(self);
  fl.FieldKind:=fkData;
  fl.SetFieldType(ftString);
  fl.FieldName:='example';
  SQLQuery1.active:=true;
  SQLQuery1.Prepare;
  MySql50connection1.Open;

  SQLQuery1.Open;
  st:=SQLQuery1.CreateBlobStream(fl,bmRead);
end;                                         


В даном отрывке кода я пробовал создать стрим для чтения поля example из стандартной базы mysql, таблица help_topic

Объект SQLQuery1 отсылает запрос "select * from help_topic"
abench
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.04.2007 20:21:28

Сообщение Attid » 18.04.2007 17:51:51

пока не пользовался mysql работаю с firebird (советую)
почитать идешь в яндекс набираешь

"delphi текстовый блоб" или лучше "delphi работа с блобами"
80% решения любой проблемы


теперь смотрим твой пример

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var fl:TField;
    st:TStream;
begin
  fl:=TField.Create(self);
  fl.FieldKind:=fkData;
  fl.SetFieldType(ftString);
  fl.FieldName:='example';
 
  SQLQuery1.active:=true;  //какой смысл открывать запрос при закрытом конекте  ?
  SQLQuery1.Prepare;
  MySql50connection1.Open;  // ну или какой смысл его открывать если он автоматом откроется поле запроса

  SQLQuery1.Open; // оппять же
  st:=SQLQuery1.CreateBlobStream(fl,bmRead);
end;


я бы сначало попробывал вот так :
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  MySql50connection1.Open;
  SQLQuery1.Open;
  st:=SQLQuery1.CreateBlobStream(fl,bmRead);
  ShowMessage(SQLQuery1.FieldByName('example').AsString);
  SQLQuery1.Close;
end;   


а потом так :
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var  st:TStream;
begin
  fl:=TField.Create(self);
  MySql50connection1.Open;
  SQLQuery1.Open;
  TBlobField(SQLQuery1.FieldByName('example')).SaveToStream(st);

  //***//
  SQLQuery1.Close;
end;   


PS кто нибуть на форуме работает с майскл ? сделайте пример для поколений.
ЗЫЫ имхо муйскл только для веба.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение abench » 02.05.2007 11:29:11

Спасибо, Attid за советы.
Оказалось, что информации о блобах не так и много :( , но кое-что почерпнуть можно :).
Оба твои способа не работают с мускулом. Мне кажется, что в TMySQL50Connection не реализована работа с блобами.
Положительный результат дала замена TMySQL50Connection на TODBCConnection. Через ODBC драйвер мускул работает нормально.
Поля типа TEXT и LONGTEXT отображаются нормально с помощью DBGrid, DBMemo без написания дополнительного кода. Но следующий фрагмент кода доказывает, что мы имеем дело с блобами:
Код: Выделить всё
  ODBCConnection1.Open;
  SQLQuery1.Open;
   for i:=0 to SQLQuery1.FieldCount-1 do
  begin
     if SQLQuery1.Fields[i].IsBlob
     then ShowMessage('field '+IntToStr(i)+' is BLOB')
     else ShowMessage('field '+IntToStr(i)+' not BLOB');
  end;
abench
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.04.2007 20:21:28


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

Рейтинг@Mail.ru