Ошибка преобразования варианта в двойной [ Delphi XE + IBObjects 4.9.12 ]

Моя конфигурация:

Delphi XE
Firebird 2.1
IBObjects 4.9.12
Windows 7, 64-разрядная версия

Я получаю исключение, когда пытаюсь установить значение для параметра IBOQuery ("Не удалось преобразовать вариант типа (UnicodeString) в тип (Double)").

Исключение возникает из процедуры TIB_Column.SetAsVariant в IB_Components.pas (строка 42795). Чтобы создать эту ситуацию, просто попробуйте передать строку в параметр даты:

myQuery.paramByName('mydate').AsString := DateToStr(IncDay(Now,5));

В течение последних 25 дней я пытаюсь решить эту ситуацию, но в списке поддержки НПА у меня нет ответов.
У кого-то есть идеи?


person TiagoTecchio    schedule 24.01.2011    source источник
comment
Какого типа ваше поле даты в базе данных? Предположим, например, что это Delphi TDateTime, тогда преобразование в строку неверно. Вы должны просто использовать что-то вроде: myQuery.paramByName('mydate').AsDateTime := IncDay(Now,5); Правильный ответ будет зависеть от типа данных, используемых в поле базы данных.   -  person David Heffernan    schedule 24.01.2011
comment
Это сообщение выдается VarCastError из модуля Variants при попытке неудачного преобразования; Попробуйте создать приложение с помощью Use Debug DCU, и вы увидите, что оно создано из Variants.pas; Мое предположение: если у IBObjects есть способ присвоить параметру тип данных, ваш параметр определяется как DATE (TDateTime = Double в Delphi, а Double — это своего рода Float). Показывает нам код в IB_Components.pas с заданным номером строки;   -  person Cosmin Prund    schedule 24.01.2011
comment
Поле базы данных - ДАТА. Как я уже сказал, в Delphi 2007 все работает нормально... Я не пробовал в Delphi 2009/2010, но, думаю, это проблема Unicode.   -  person TiagoTecchio    schedule 24.01.2011
comment
Ну тогда ИБО наверное поумнел. Сам Firebird прекрасно способен преобразовывать STRING в DATE, и предыдущая версия IBO, вероятно, передавала строку без изменений. Тем не менее, эта ошибка на самом деле является хорошей вещью, потому что передавать значения DATE как STRING — очень плохая идея: Firebird предполагает, что ваша дата находится в одном из двух допустимых форматов, как фиксированных, так и не связанных с локалью Windows. DateToStr() преобразует в соответствии с вашим языком, поэтому, если вы столкнетесь с пользователем, для которого установлен формат даты ДД.ММ.ГГГГ, двойное преобразование завершится ошибкой.   -  person Cosmin Prund    schedule 24.01.2011
comment
@Cosmin спасибо за ваши советы. Теперь я буду уделять этому больше внимания.   -  person TiagoTecchio    schedule 24.01.2011


Ответы (1)


Архитектура IBObjects преобразует (в момент выполнения) все параметры, поля и т. д. в строку или варианты. Если ваш параметр «mydate» имеет тип «DateTime» (числовой), вы должны заполнить его значением соответствующего типа. Не логично заполнять параметр типа "числовой" строкой...

попробуй это

myQuery.paramByName('mydate').AsDateTime:= Now+5; //то же самое, что и ответ Дэвида.

or

myQuery.paramByName('mydate').AsFloat:=Сейчас+5; //или IncDay(Сейчас,5)

С уважением,
Раду

person RBA    schedule 24.01.2011
comment
Я предполагаю, что база данных, стоящая за этим, может хранить дату, используя что-то другое, а не TDateTime Delphi. - person David Heffernan; 24.01.2011
comment
Преобразование из STRING в STRING или VARIANT никогда не должно завершаться ошибкой. Преобразование из STRING в DateTime может завершиться ошибкой, особенно если строка является результатом DateToStr(). - person Cosmin Prund; 24.01.2011
comment
Раду, спасибо за ответ. Я пробовал это и отлично работает, но проблема в том, чтобы найти все ParamByName и исправить. В предыдущих версиях Delphi все работало нормально. - person TiagoTecchio; 24.01.2011
comment
Попробуйте использовать утилиту поиска GExpert Grep. Или с помощью функции поиска Delphi из среды IDE (поиск в файлах). - person RBA; 24.01.2011
comment
Да, конечно, Grep Search — отличная утилита. Но разочаровывает то, что функциональность, которая отлично работала годами, вдруг перестала работать. - person TiagoTecchio; 24.01.2011
comment
@Tiago Вероятно, раньше это не работало. Как только вы перенесете свое приложение на машину с настройками формата даты, которые не соответствуют Firebirds, у вас возникнут проблемы. - person David Heffernan; 24.01.2011
comment
@Tiago Более того, я не могу поверить, что трудно найти все поля даты. Вы должны знать их имена? Они будут в вашем исходном коде, заключенные в одинарные кавычки. Базовый Delphi Find in Files поможет выполнить работу в кратчайшие сроки. Если у вас есть сотни применений, подумайте о том, чтобы лучше разложить код на множители, чтобы было легче изменить и централизовать настройку поля базы данных. - person David Heffernan; 24.01.2011
comment
@David Спасибо за ваши ответы, я знаю, что могу заменить все записи, которые могут пойти не так, но, как я уже сказал, в моем случае установка параметра строки на дату всегда работала отлично. Я не уверен насчет других сюрпризов, которые меня ждут при переходе с Delphi 7/2007 на XE — это похоже на вершину айсберга. - person TiagoTecchio; 24.01.2011