Помогите разобраться с размерами FieldByName!!!

Heleg912
Дата: 26.04.2011 22:58:15
Доброго времени суток!

Имеется СУБД Oracle XE. Пишу под него клиент в Delphi2010, использую библиотеку EhLib 5.2.
Суть проблемы: имеется поле в таблице типа VARCHAR2(n). Если n<255 то весь код в клиенте (добавление, удаление и т.д.) отрабатывает корректно. Если n>255, а хранить нужно именно достаточно длинный текст, возникает исключение: "Project ***.exe raised exception class EVariantInvalidError with message 'Invalid argument' " на следующей строчке кода:
FieldByName('PROCESS_DISC').AsString := RichEditDBProcess.Text;
Как видно, длинный текст берется из RichEdit.
При добавлении напрямую через командную строку все ОК, т.е. косяки сервера исключены. Отображает эти данные тоже как надо, вся проблема в добавлении в FieldByName!!!

Кто нибудь знает причину и как её обойти???
Dimitry Sibiryakov
Дата: 26.04.2011 23:10:41

Heleg912
Кто нибудь знает причину и как её обойти???

Техподдержка использованных компонент доступа должна знать.

Posted via ActualForum NNTP Server 1.4

Heleg912
Дата: 26.04.2011 23:20:15
автор
Техподдержка использованных компонент доступа должна знать.


Да вряд ли дело в них, т.к. функция FieldByName() у данного компонента (TMemTableEh) имеет тип для TFields, как у обычного TQuery. Для порядку конечно попробую с TQuery, но что-то подсказывает что не здесь собака зарыта.
Johnmen
Дата: 27.04.2011 09:20:39
Heleg912
...функция FieldByName() у данного компонента (TMemTableEh) имеет тип для TFields, как у обычного TQuery...

И что за тип? И какой размер поля?
Ramin Hashimzade
Дата: 27.04.2011 09:51:53
может весь код выложить ...???
Heleg912
Дата: 27.04.2011 10:52:37
автор
И что за тип? И какой размер поля?

Не совсем корректно выразился AsString это свйство(property): DB.TField.AsString. Справка говорит следующее:
автор
Represents the field's value as a string (Delphi) or an AnsiString (C++).

Reading the AsString property returns the abbreviated class name of the field component enclosed in parentheses. The abbreviated class name is built by stripping the leading 'T' from the class name and removing the trailing word 'FIELD', except in the case of TField where that would leave an empty string. Thus, the abbreviated class name of TField is "FIELD", the abbreviated class name of TVarBytesField is "VarBytes", and so on.

Trying to set the AsString property raises an exception.

Descendants of TField that represent string fields or that support conversions between the field's Value property and a string override AsString to read and write the value of the field as a different, more meaningful, string.

Т.е по сути он преобразует значение поля в обычный String, отсюда и размер, т.е. по сути не ограничен.

Мне кажется что в этом методе собака и зарыта. Дело в том что в типе VARCHAR2(n) начиная с n=256 и выше Delphi начинает воспринимать поле как Memo. Если попытаться вывести его в Grid то он будет отображаться там надпись: (MEMO), в TDBMemo нормально. Если n<=255 то и в Grid'e все отображается в одной строке и все ок. Вот такие мысли пока...
Heleg912
Дата: 27.04.2011 10:59:09
Ramin
может весь код выложить ...???


Ну весь то может и нет смысла, но этот функциональный кусок вот:
if RichEditProcess.Enabled then
    begin
      with Data_Module do
        begin
          MemTableEh1.Active := false;
          MemTableEh1.DataDriver := BDEDataDriverEh1;
          MemTableEh1.Active := true;

          BDEDataDriverEh1.InsertSQL.Clear;
          BDEDataDriverEh1.InsertSQL.Add('Insert into PROCESS_TYPE Values('+''''+EditCodeProcess.Text+''''+', '+''''+EditNameProcess.Text+''''+', '+''''+RichEditProcess.Text+''''+')');

          with MemTableEh1 do
            begin
              Insert;

              FieldByName('PROCESS_TYPE_ID').AsString := EditCodeProcess.Text;
              FieldByName('PROCESS_NAME').AsString := EditNameProcess.Text;
              FieldByName('PROCESS_DISC').AsString := RichEditProcess.Text;  //ВОТ ТУТ ИСКЛЮЧЕНИЕ

              Post;

              Refresh;
            end;
        end;
    end;
Heleg912
Дата: 27.04.2011 11:02:04
Еще раз чтобы было понятно:
ставим тип поля VARCHAR2(256), вставляем строчку из командной строки - все корректно. Заходим в клиент, отображение данной записи в Grid'e и этого длинного поля в TDBMemo тоже корректно. Хотим вставить новую запись из клиента, заполняем хотя бы 1 символом RichEdit (чтобы вставить в поле типа VARCHAR2(256)), в итоге на указанной строчке указанная ошибка. Если поставить VARCHAR(255), все ОК.
Gwa
Дата: 27.04.2011 11:10:39
Heleg912,
у Вас написан insert-запрос.
Выполните его и сделайте refresh
Зачем Вы делаете после этого заполнение через FieldByName?
Gwa
Дата: 27.04.2011 11:18:16
Тока чащ заметил, что в insert-запросе не перечислены поля, а надо бы..