Для Delphi ClientDataSets, где поля были определены во время разработки, есть ли способ во время выполнения изменить тип данных определенного поля (изменить cds.Fields [n] .DataType)?Как изменить тип данных поля clientdataset во время выполнения
У меня есть устаревшая программа Delphi 7 с полями SQLDataSet и ClientDataSet, установленными во время разработки (чтобы переопределить различные свойства).
Они подключены к базе данных Sybase SQL Anywhere 11 третьей стороны.
Недавно продавец изменил все поля «Описание» от VarChar (128) до длинного varchar, но только для некоторых из его клиентов. Таким образом, мой код должен поддерживать оба типа полей, когда я запрашиваю эти поля «Описание».
Я надеялся установить условную компиляцию в типах классов классов (затем добавьте поля перед открытием набора данных SQL/CLient), но компилятор игнорирует условные выражения {$ IFDEF} в разделе определения компонентов класса (который, тем больше я думаю об этом, имеет смысл)!
Есть десятки модулей, в которых пострадали сотни полей, поэтому всякое понимание оценено.
Спасибо.
Приветствия, EDB
Либо не добавляйте это поле до времени выполнения, а затем добавляйте соответствующий тип в эту точку или удаляйте его во время выполнения, если необходимо, и добавьте новый тип нужного вам типа. –
Что сказал @KenWhite. Он должен работать нормально, но если у соответствующего поля (ов) есть аналог FieldDef, вам нужно удалить и воссоздать, иначе вы, вероятно, получите сообщение об ошибке, связанное с несоответствием между типом данных, определенным в FieldDef, и заменяющим TField когда вы открываете CDS. Лично я был бы склонен воссоздавать все поля/fielddefs, а не только те, которые были задействованы. – MartynA
К сожалению, изменений в БД больше, чем я изначально думал - это может быть тысяча полей (в нескольких проектах). Он также имеет побочные эффекты - я широко использую DBgrids - я получаю (MEMO) вместо данных. Я могу установить OnGetText поля, но опять же, огромное количество полей ... CDS определены во время разработки, но я динамически создаю SQL - я думаю о том, чтобы просто делать CAST/Convert to VARCHAR в SQL. Хм, могут возникнуть проблемы с полями [n] .DataSize, например. - литье длинного varchar в поле, которое изначально было определено в CDS как VarChar [128] ... – edbored