Добавление 1 к параметру datetime: Тип операнда clash: datetime2 несовместим с int.Исправить в коде, а не в SQL? - PullRequest
0 голосов
/ 09 мая 2018

1 - Создать тестовую таблицу в SQL Server:

CREATE TABLE dbo.TESTCAL
 (
  TT_CALENDAR_ID INTEGER  NOT NULL,
  TT_START DATETIME NULL,
  TT_FINISH DATETIME NULL,
  TT_EMP_ID INTEGER NULL,
  TT_CAPTION VARCHAR(50) NULL
)

2 - Поместите TFDQuery в форму с помощью команды SQL:

INSERT INTO TESTCAL
 (TT_CALENDAR_ID
 ,TT_START
 ,TT_FINISH
 ,TT_EMP_ID
)
VALUES
(:ID
 , :TTX_DATUM
 , :TTX_DATUM2  + 1
 , :TTX_EMP_ID
)

3 - Определить 4 параметра ptInput типа ftInteger, ftdateTime, ftdateTime и ftInteger.

4 - выполнить запрос:

with FDQuery1 do
begin
  Params[0].AsInteger  := Random(100);
  Params[1].AsDateTime := Now;
  Params[2].AsDateTime := Now;
  Params[3].AsInteger  := Random(100)+100;
  ExecSQL;
end;

Это похоже на преобразование параметра # 2 в тип datetime2 и выдает ошибку Operand type clash: datetime2 is incompatible with int. Это здесь не неизвестная ошибка ;-). Я могу исправить это, например,

INSERT INTO TESTCAL
 (TT_CALENDAR_ID
 ,TT_START
 ,TT_FINISH
 ,TT_EMP_ID
)
VALUES
(:ID
 , :TTX_DATUM
 , DATEADD(dd,1,:TTX_DATUM2)
 , :TTX_EMP_ID
)

Но: Можно ли предотвратить ошибку, не изменяя саму команду SQL ?
Потому что: Этот вид кода находится в различных (пользовательских) скриптах, работающих на компьютерах многих клиентов. Ошибка начинает возникать после переключения на FireDAC.

1 Ответ

0 голосов
/ 11 мая 2018

В Плохие привычки к удару: используя сокращение от операций с датой / временем , Аарон Бертран показывает несколько вредных привычек вычисления даты и советует (как это сделали некоторые комментаторы) прекратить делать такие целые числа / дата расчета:

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

Мы последуем этому совету, откушим маркер и начнем обновлять эти сценарии с помощью DATEADD () (поэтому отбрасываем требование без изменения самой команды SQL в вопросе).

...