WideMemo и WideStringField

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Закрыто
Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

WideMemo и WideStringField

Сообщение Akella » Ср 18 июл 2012 14:19

Запрос:

Код: Выделить всё

SELECT distinct 
     a.id
     , a.txt
...
...
, (SELECT CONVERT(group_concat(CONCAT_WS('.',EXTRACT(DAY FROM date_out), EXTRACT(MONTH FROM date_out)) SEPARATOR ',') USING UTF8) FROM datas dd1 where dd1.id_ads = a.id) as datas_list
...
...
FROM
  ads a

или

Код: Выделить всё

              , convert((SELECT group_concat(concat_ws('.', extract(DAY FROM date_out), extract(MONTH FROM date_out)) SEPARATOR ',')
                 FROM
                   datas dd1
                 WHERE
                   dd1.id_ads = a.id) USING UTF8) AS datas_list
обратите внимание на (SELECT CONVERT(group_concat(CONCAT_WS(......
TUniQuery создает столбец типа TWideStringField.


Когда открываю датасет, то получаю ошибку:
qAds: Type mismatch for field 'Список дат', expecting: WideString actual: WideMemo
Если вызвать DataEditor, то получаю вот такую картину:
Изображение

хотя db Forge показывает данные в таблице нормально
Изображение

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: WideMemo и WideStringField

Сообщение Akella » Ср 18 июл 2012 14:53

Если задействовать SUBSTR, то вообще BLOB получается
Изображение

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: WideMemo и WideStringField

Сообщение AndreyZ » Чт 19 июл 2012 09:50

Здравствуйте,

При выполнении запроса UniDAC создает поля используя типы которые возвращает MySQL. Если Вы создали постоянные поля (persistent fields) в датасете используя один запрос а потом изменили запрос на другой, то Вам необходимо пересоздать постоянные поля.
При использовании приведенного выше кода Вы можете контролировать тип поля datas_list используя опцию LongStrings. LongStrings используется для представления строковых полей с длиной большей 255 символов типом TStringField (TWideStringField) вместо TMemoField (TWideMemoField). Например:

Код: Выделить всё

UniQuery1.SQL.Text := 'SELECT CONVERT(group_concat(CONCAT_WS(''.'',EXTRACT(DAY FROM dt), EXTRACT(MONTH FROM dt)) SEPARATOR '','') USING UTF8) datas_list FROM testdates';
UniQuery1.Options.LongStrings := True;
UniQuery1.Open;
ShowMessage(UniQuery1.FieldByName('datas_list').ClassName); // TWideStringField
UniQuery1.Close;
UniQuery1.Options.LongStrings := False;
UniQuery1.Open;
ShowMessage(UniQuery1.FieldByName('datas_list').ClassName); // TWideMemoField
Также, начиная с UniDAC версии 4.2.7, Вы можете испльзовать новую функциональность - Data Type Mapping. Data Type Mapping позволяет создавать соответствие между типами базы данных и типами IDE. Например:

Код: Выделить всё

UniQuery1.DataTypeMap.AddFieldNameRule('datas_list', ftWideString);
UniQuery1.SQL.Text := 'SELECT CONVERT(group_concat(CONCAT_WS(''.'',EXTRACT(DAY FROM dt), EXTRACT(MONTH FROM dt)) SEPARATOR '','') USING UTF8) datas_list FROM testdates';
UniQuery1.Options.LongStrings := True;
UniQuery1.Open;
ShowMessage(UniQuery1.FieldByName('datas_list').ClassName); // TWideStringField
UniQuery1.Close;
UniQuery1.Options.LongStrings := False;
UniQuery1.Open;
ShowMessage(UniQuery1.FieldByName('datas_list').ClassName); // TWideStringField
Более подробную информацию о Data Type Mapping Вы найдете в статье "Working with Data Type Mapping" документации UniDAC.

Закрыто