powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Передача даты как параметра в хранимую процедуру
25 сообщений из 40, страница 1 из 2
Передача даты как параметра в хранимую процедуру
    #39140412
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите как вылечить.

В хранимой процедуре входящий параметр PDate1 типа Date.

используется так
...
WHERE Date1=:PDate1

Из FIBDataset вызываю процедуру:

SelectSQL.Add('SELECT * FROM StoredProcName(:PDate1, ...)');
Prepare;
Params.ParamByName('PDate1').AsDate:=MyDate; // MyDate любой пробовал и NOW и как строку '30.12.2015' по всякому

Попадая в запрос MyDate становится похожа на '30-DEC-2015'
Вываливается ошибка:
Incompatible column/host variable data type.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140413
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesВ хранимой процедуре входящий параметр PDate1 типа Date.

используется так
...
WHERE Date1=:PDate1

Попадая в запрос MyDate становится похожа на '30-DEC-2015'
Вываливается ошибка:
Incompatible column/host variable data type.

Вызови процедуру из IbExpert , если работает тогда тебе в соседний форум по дельфи.

P.S.
Покажи саму процедуру.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140445
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граур СтаниславПокажи саму процедуру.
В процедуре параметр как строка, как пить дать.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140464
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites, при использовании в SQL скрипте предпочитаю указывать дату в ISO формате, т.к. этот формат универсален и поддерживается практически всеми rdbms. В Firebird он также поддерживается, но вместо разделителя 'T' между датой и временем используется [пробел].
Код: plsql
1.
SELECT CAST('2015-12-30 12:30' AS TIMESTAMP) FROM RDB$DATABASE


Из Delphi лучше использовать переменные типа TDateTime.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140620
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesParams.ParamByName('PDate1').AsDate:=MyDate; // MyDate любой пробовал и NOW
и как строку '30.12.2015' по всякому
Врёшь. На строку у тебя должна была ругаться Delphi, поскольку она несовместима с
TDateTime в принципе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140646
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да в .Value он пихает, почти наверняка
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140647
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochда в .Value он пихает, почти наверняка
ССЗБ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140649
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesSelectSQL.Add('SELECT * FROM StoredProcName(:PDate1, ...)');

чисто процедурное

лучше

Код: pascal
1.
SelectSQL.Text := 'SELECT * FROM StoredProcName(:PDate1, ...)';



Мало ли что у тебя там УЖЕ было, во-первых.
Ну и разные TStrings.BeginUpdate/EndUpdate автоматически
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140650
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь после присвоения значения чему равен ParamByName('PDate1').DataType (или FieldType, не помню)

Если ты присвоение выполнил правильно, то он должен стать типа ftDateTime
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140651
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Особенно хорошо в Value=AsDouble лягут Now() и Date()

Хотя и в компонентах бывают неожиданности, я сейчас с UIB разщвлекаюсь, там у параметров-блоблв .AsxxxString не работают, нужно обходными путями.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140665
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,

нашел вот такое-вот, не знаю оно или нет
ShowMessage(IntToStr(Params.ParamByName('field').SQLType));

Возвращает у поля типа дата значение 510. таблицу соответствия кодов типам данных не нашел, но проверил, если тип Integer, тогда значение 496 (т.е. отличается, а видимо и работает).
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140667
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

под строкой подразумевалось установка формата даты руками, т.е. StrToDate('12.12.1222'), чтобы случайно не вышло 12/12/1222.
И еще в ХП тип данных поля менялся с Date на Varchar(10), и тогда просто стринг через параметр.
В общем пробовал по всякому )
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140668
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

Граур СтаниславПокажи саму процедуру.
wadmanВ процедуре параметр как строка, как пить дать.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140669
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIMESTAMP еще тип в SP попробуй
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140671
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Процедуру проверял в IBExpert. При запуске высвечивается окошко для ввода значения входных параметров типа Date и Integer (у меня 2 входных параметра). Все отрабатывает без проблем, т.е. с ХП проблем нет.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140672
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesВ общем пробовал по всякому )
По-всякому - не надо. Твой пример из первого поста должен работать. Если нет - давай
точный код, который не работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140676
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesнашел вот такое-вот, не знаю оно или нет
ShowMessage(IntToStr(Params.ParamByName('field').SQLType));

Нет, тоже интересно, но не оно. Это тип данных в терминах SQL, как думает FIB+

А меня интересовал тип данных в терминах Delphi

http://docwiki.embarcadero.com/Libraries/XE8/en/Data.DB.TParam.DataType

"Возвращает у поля типа дата значение 510. таблицу соответствия кодов типам данных не нашел"

Берешь исходники Firebird и смотришь.
Вариант, берешь исходники Unified Interbase и смотришь.
Вариант, берешь исходники FIB+ и смотришь.

Искать в районе присвоения значений полям и параметрам - там как раз будут простыни методов перевода данных между типами Delphi и типами IB/FB

Спесьял фа йа
uibase.pas
....
(*******************
* SQL definitions *
*******************)

SQL_TEXT = 452; // Array of char
SQL_VARYING = 448;
SQL_SHORT = 500;
SQL_LONG = 496;
SQL_FLOAT = 482;
SQL_DOUBLE = 480;
SQL_D_FLOAT = 530;
SQL_TIMESTAMP = 510;
SQL_BLOB = 520;
SQL_ARRAY = 540;
SQL_QUAD = 550;
SQL_TYPE_TIME = 560;
SQL_TYPE_DATE = 570;
SQL_INT64 = 580;

{$IFDEF FB30_UP}
SQL_BOOLEAN = 32764;
{$ENDIF}

{$IFDEF FB25_UP}
SQL_NULL = 32766;
{$ENDIF}

{$IFDEF IB7_UP}
SQL_BOOLEAN = 590;
{$ENDIF IB7_UP}

(* Historical alias for pre V6 applications *)
SQL_DATE = SQL_TIMESTAMP;
....
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140677
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

with dm.DSet do
begin
Active:=False;
SelectSQL.Text:='SELECT * FROM GET_VALUES(:PField1Integer_id, :PField2Date)';
Prepare;
Params.ParamByName('PField1Integer_id').AsInteger:=1;
Params.ParamByName('PField2Date').AsDate:=DateTimePicker1.Date;
Active:=True;
end;
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140680
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

попробуй ...AsDateTime := DateTimePicker1.Date;

или ...AsTimeStamp := DateTimePicker1.Date;

если такое есть

твоя цель - правильно выставленный у параметра .DataType

И кстати тебе в принципе никто не запрещает отладить этот вызов .AsDate := xxx внутрь VCL/FIB+
Равно как и отладить вызов Active := 'false';

Цель все та же, понять выставляется ли DataType у параметра.
Если да - то как это учитывается при переводе значения в формат FB
Если нет - то почем не выставляется

И еще интересно, есть ли в FIB+ разные настройи по передаче даты в разных версиях IB/FB
Если дата действительно библиотекой превращается в строку...
...тогда тем более, отлаживай внутренности Active := False и наткнегшься на вычитывнаи параметров где и будет провер всех этих настроек, если они есть.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140681
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Равно как и отладить вызов Active := 'false';

Читать "Active := TRUE"
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140684
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DBConstructor,

Не всегда в используемых компонентах типа календарь (на клиенте они могут быть разными) есть Time.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140685
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

тип все равно один и тот же

type TDate = type double;
type TTime = type double;
type TDateTime = type double;

хотя по факту Date=trunc(DateTime) и Time=frac(DateTime)


но промежуточная переменная имеет смысл - ты во-первых фиксируешь значение в переменной и всегда при отладке можешь в неё глянуть, во вторых разносишь по разным строкам разные операции "вычитать значение из контрола" и "занести значение в параметp".

для отладки помогает - разделяй и властвуй.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140687
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем в том же UIB сделано правильно

(TParam/TField).AsDateTime : TDateTime==double
(TParam/TField).AsDate : word



Хочешь или нет - будешь транковать
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140688
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Многое перепробовал с конвертацией
asDateTime, Timestamp, пока ничего

Params.ParamByName('blabla').AsTimeStamp:=DateTimeToTimeStamp(DateTimePicker1.Date);

Идея ясна, буду биться, решу - отпишусь, спасибо.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140690
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перебирать варианты подряд - это комбинаторный взрыв.

тебе нужно адресно проверить два наиболее вероятных места

AriochЦель все та же, понять выставляется ли DataType у параметра.
Если да - то как это учитывается при переводе значения в формат FB
Если нет - то почему не выставляется

После чего станет яснее что и как выправлять

Use the source, Luke!
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Передача даты как параметра в хранимую процедуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]