Конференция "Базы" » глюк в StoredProc при переходе на новую версию Делфи [D7]
 
  • qwas © (29.01.16 11:35) [0]
    программа, созданная в делфи7 работает 15 лет. в ней я передаю параметры в процедуру StoredProc таким образом:

       Params[12].Asfloat := strtofloat(edit14.text);
       Params[13].Asfloat := strtofloat(edit6.text);
       Params[14].Asfloat := strtofloat(edit7.text);
              .........
    и так 120 параметров.
    установил делфи2010, и в нем открыл исходники и откомпилировал.
    после этого в момент передачи параметров такая ошибка:

    Invalid Floating Point Operation

    в результате долгих раздумий поменял способ передачи параметров на такой:

       Params[12].value := strtofloat(edit14.text);
       Params[13].value := strtofloat(edit6.text);
       Params[14].value := strtofloat(edit7.text);
              .........

    После этого все стало работать без проблем.
    и в другом месте у меня тоже есть такая передача параметров (как я описал вначале) , но там параметров не 120 а 2 или 3.
    и когда параметров мало, то ошибка не возникает тоже.
    Что это может быть? В делфи ХЕ6 тоже самое. а в делфи7 все работает без этих проблем.
  • sniknik © (29.01.16 11:50) [1]
    > Что это может быть?
    а проверить значение на котором возникает
    Invalid Floating Point Operation
    ?

    > все стало работать без проблем.
    эээ... уверен? то что дельфя не смогла преобразовать, ты передал в варианте и стал преобразовывать сервер... он может не просто не сообщил, а подставил дефаулт, с потерей значения.
    т.е. проблема могла просто "спрятаться"  и отложится до тех пор пока в нее не упрутся.

    > а в делфи7 все работает без этих проблем.
    вообще ошибка о некорректных данных, что может быть на любой дельфе.
    + strtofloat зависит от настроек системы, т.е. еще и на разных машинах ошибка то будет(/возможна) то нет.
  • qwas © (29.01.16 12:13) [2]
    ошибка возникает в момент вызова хранимой процедуры ExecProc

    передаю я не в варианте. потому что типы этих всех параметров я указал в Params этой процедуры.   то есть они определены статически заранее , их тип я поставил ftFloat

    некорректными данными быть не могут. программа работает 15 лет и каждый день в нее вводят тысячи значений через эту процедуру.
    а именно при компиляции в новой делфи эта ошибка возникает с любыми значениями. да и значения там обычно просто нули или другие целые числа.  делфи старая и новая стоит на 1 машине. то есть одинаковые настройки региональные, одниковое BDE и база
  • кгшзх © (29.01.16 12:23) [3]
    передаю я не в варианте.

    вот твой вариант :
    Params[14].value

    и это именно variant
  • qwas © (29.01.16 12:35) [4]
    но этот самый  параметр номер 14 у меня в свойствах StoredProc обозначен как ftFloat.
    хотя  в любом случае в Делфи7
    Params[14].Asfloat := strtofloat(edit7.text);
    работало 15 лет как часы.
    а в новой делфи только через вариант работает
    Params[14].value := strtofloat(edit7.text);
    и опять же, если параметров мало то тоже работает .а именно если их сотня тогда ошибка
  • sniknik © (29.01.16 12:57) [5]
    > Params[14].Asfloat := strtofloat(edit7.text);
    > работало 15 лет как часы.
    оно и сейчас должно работать... если данные правильные. поэтому желательно бы определить на каких конкретно ошибка. или зависимость ... ну если к примеру где в новой дельфе буфер уменьшили, а у тебя аж 120 параметров... т.е. если к примеру всегда валится на сотом, при том что в данных то же число строкой что рядом, и параметр того же типа... это было бы показательно.

    > .а именно если их сотня тогда ошибка
    ... и параметры определены одинаково?
    они же приводятся к тому типу что прописан (ты пишешь Asfloat, "внутри" стоит строка, получается строка с запятой, ну и понятно на выполнении для всех движков запятая признак перечисления, а не разделитель)

    > одниковое BDE и база
    BDE? еще живо? нда. а вы там случаем в новой дельфе под 64бита не компилите? и такое BDE тоже есть?
  • sniknik © (29.01.16 13:05) [6]
    > а именно при компиляции в новой делфи эта ошибка возникает с любыми значениями.
    если на компиляции то проще, поставь "use debug DCU"  сделай билд, и после посмотри более конкретно место где ошибка (может реально что-то с буфером/аналогичным... как там вообще список формируется).
  • кгшзх © (29.01.16 13:13) [7]
    но этот самый  параметр номер 14 у меня в свойствах StoredProc обозначен как ftFloat.

    какая разница какого типа параметр,
    если делфийское свойство Value имеет тип Variant.
    никакой.
  • qwas © (29.01.16 13:32) [8]
    хорошо, попробую уменьшать количество параметров и при этом отлавливать на каком количестве перестанет возникать ошибка.
    может точно буфер меньше в новых дельфях
    а насчет данных-конечно я ради эксперимента ввожу абсолютно одинаковые данные, например одни 1 или одни нули. и в старой версии и в новой.

    там где float там конечно только числа использую а не строку.

    BDE по 64 разряда не использую, не подскажу
  • кгшзх © (29.01.16 13:42) [9]
    иногда голова конечно враг рукам.

    взять то, что работало 15 лет без гемора,
    и ничего не меняя в архитектуре, просто захотеть перекомпилировать это под новую среду.
    причем еще и оставить БДЕ.

    зачем.
  • Лори (29.01.16 14:10) [10]

    >    Params[12].Asfloat := strtofloat(edit14.text);
    >    Params[13].Asfloat := strtofloat(edit6.text);
    >    Params[14].Asfloat := strtofloat(edit7.text);


    Я бы начал с того что проверил все эдиты. Вот что там? Лог надо вести:

    Log.Add('edit14 == '+edit14.text);
    Params[12].Asfloat := strtofloat(edit14.text);
    Log.Add('edit6 == '+edit6.text);
    Params[13].Asfloat := strtofloat(edit6.text);
    Log.Add('edit7 == '+edit7.text);
    Params[14].Asfloat := strtofloat(edit7.text);



    Мож во всех эдитах точки, а в одном запятая затесалась?
  • кгшзх © (29.01.16 14:12) [11]
    проверять эдиты не надо.
    их надо было бы проверять при

    "xxx" is not floating point value
  • Лори (29.01.16 14:28) [12]
    Как так не надо? А например во всех эдитах целые числа, в одном с десятичными? Или где-то ноль?
  • кгшзх © (29.01.16 14:49) [13]
    при этом исключение будет другое.
  • кгшзх © (29.01.16 14:50) [14]
    если децимал сепаратор не тот что у него в эдите, исключение будет другое.
  • qwas © (29.01.16 15:53) [15]
    во всех эдитах нули я пробовал забивать. то есть с данными все ок.
    и опять же, в проге откомпилированной под старый делфи я забивал абсолютно такие же данные.  теже нули или теже единицы. и ошибок не было.
    методом долгих экспериментов я почти подошел к разгадке.
    среди параметров были параметры не только числовые но и символьные, типа :

      Params[12].Asstring := 'ddffdf';
      Params[13].Asstring :=  'ddffdf';

    так вот, если этих строковых параметров больше 2-3 то и возникает ошибка!
    а если их 2 или меньше, то все нормально!
    причем я присваивал им именно такие как я указал выше значения. то есть не было там иероглифов в этих строках или какихто спецсимволов и тп.
    похоже это какойто глюк новых версий делфи или связка "новое делфи-БДЕ".
    если указать так:

      Params[12].value := 'ddffdf';
      Params[13].value :=  'ddffdf';

    то все ок
  • Лори (29.01.16 16:21) [16]
    Просто "Invalid Floating Point Operation" - операция с числом. Чаще всего деление на ноль. А число-то из строки берётся.

    Именно одинаковых? Строка из переменной/объекта или точно как показали - константой в коде?
    Текст ошибки не изменился? Вылезает посреди задании параметров или при вызове процедуры или кого там?
  • кгшзх © (29.01.16 16:31) [17]
    1. убери бде.
    2. вместо стапятисот параметров сделай один блоб-параметр (например xml)
  • qwas © (29.01.16 16:32) [18]
    в старой версии делфи нет никаких ошибок. то есть нет делений на ноль.
    пробовал просто присваивать всем параметрам нули например.
    все равно ошибка на новом делфи.
    ошибка при вызове ExecProc
    строка пробовал даже просто в коде прописывать ради эксперимента
    то есть
    Params[13].Asstring :=  'ddffdf';

    и ошибка возникает если таких строковых параметров больше 2-3. если меньше то ошибки нет.
  • qwas © (29.01.16 16:34) [19]
    насчет убрать БДЕ это понятно. но программа работает на крупном предприятии 15 лет.
    именно с БДЕ
    смысл менять архитектуру?
    просто интересно было понять это глюк новых делфи в связке с БДЕ или что
 
Конференция "Базы" » глюк в StoredProc при переходе на новую версию Делфи [D7]
Есть новые Нет новых   [118664   +31][b:0][p:0.001]