Базы данных MySQL поддерживають поля типа TEXT LONGTEXT. Как их отобразить средствами Lazarus? Ведь ни TDbGrid TDbMemo такие поля не отображают. Мало того, даже упоминание о полях этого типа отсутствует в результатах запросов - на запрос типа "select * from table" в свойствах
fields компонента TSQLQuery вы не найдете полей типа TEXT LONGTEXT. Подскажите решение для отображения и доступа к таким полям.
отображение TEXT LONGTEXT полей (MySQL) в Lazarus
Модератор: Модераторы
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"
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
пока не пользовался mysql работаю с firebird (советую)
почитать идешь в яндекс набираешь
"delphi текстовый блоб" или лучше "delphi работа с блобами"
80% решения любой проблемы
теперь смотрим твой пример
я бы сначало попробывал вот так :
а потом так :
PS кто нибуть на форуме работает с майскл ? сделайте пример для поколений.
ЗЫЫ имхо муйскл только для веба.
почитать идешь в яндекс набираешь
"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 за советы.
Оказалось, что информации о блобах не так и много
, но кое-что почерпнуть можно
.
Оба твои способа не работают с мускулом. Мне кажется, что в TMySQL50Connection не реализована работа с блобами.
Положительный результат дала замена TMySQL50Connection на TODBCConnection. Через ODBC драйвер мускул работает нормально.
Поля типа TEXT и LONGTEXT отображаются нормально с помощью DBGrid, DBMemo без написания дополнительного кода. Но следующий фрагмент кода доказывает, что мы имеем дело с блобами:
Оказалось, что информации о блобах не так и много
Оба твои способа не работают с мускулом. Мне кажется, что в 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;
