Delphi: “Объект параметра неправильно определяется. Непоследовательная или неполная информация была предоставлена”.

Использовать LAG (COLUMN_NAME)

Запрос

SELECT id, School_ID, Enrollment_Start_Date, cOrder,
ISNULL((cOrder - (LAG(cOrder) OVER(PARTITION BY id, School_ID ORDER BY Enrollment_Start_Date))),cOrder)Diff
FROM Table1

Выход Samle

| id | School_ID | Enrollment_Start_Date | cOrder | Diff |
|----|-----------|-----------------------|--------|------|
|  1 |        56 |            2018-01-01 |     10 |   10 |
|  1 |        56 |            2018-05-05 |     24 |   14 |
|  1 |        56 |            2018-07-07 |     35 |   11 |
|  1 |       103 |            2019-03-03 |     19 |   19 |
|  1 |       103 |            2019-04-04 |     26 |    7 |

Демонстрация SQL Fiddle

7
задан Mason Wheeler 2 April 2009 в 23:23
поделиться

5 ответов

Я могу получить эту ошибку, используя Delphi 2007 и MSSQL Server 2008, и я нашел обходной путь. (это довольно дурацкое ИМХО, но может быть полезно вам, если ваш вызван той же самой причиной.) Код

, чтобы вызвать ошибку:

with TADOQuery.Create(nil)
do try

   Connection := ADOConnection;

   SQL.Text := ' (SELECT * FROM Stock WHERE  InvCode = :InvCode ) '
              +' (SELECT * FROM Stock WHERE  InvCode = :InvCode ) ';

   Prepared := true;

   Parameters.ParamByName('InvCode').Value := 1;

   Open;  // <<<<< I get the "parameter object is...etc. error here.

 finally
   Free;
 end;

Я нашел два способа ее исправить:

1) удалить скобки из SQL, то есть:

   SQL.Text := ' SELECT * FROM Stock WHERE  InvCode = :InvCode  '
              +' SELECT * FROM Stock WHERE  InvCode = :InvCode  ';

2) использовать два параметра вместо одного:

with TADOQuery.Create(nil)
do try

   Connection := ADOConnection;

   SQL.Text := ' (SELECT * FROM Stock WHERE  InvCode = :InvCode1 ) '
              +' (SELECT * FROM Stock WHERE  InvCode = :InvCode2 ) ';

   Prepared := true;

   Parameters.ParamByName('InvCode1').Value := 1;
   Parameters.ParamByName('InvCode2').Value := 1;

   Open;  // <<<<< no error now.

 finally
   Free;
end;
4
ответ дан 6 December 2019 в 23:13
поделиться

Если я помню хорошо, Вы имеете к явному помещенному Нулевому значению к параметру. При использовании компонента TAdoStoredProc необходимо сделать это во время проектирования.

0
ответ дан 6 December 2019 в 23:13
поделиться

Вы установили DataType параметра, или Вы оставляли его как ftUnknown?

0
ответ дан 6 December 2019 в 23:13
поделиться

Вы используете какую-либо поточную обработку? Я, кажется, не забываю получать эту ошибку, когда событие таймера запустило запрос, в то время как соединение ADO использовалось для другого синхронного запроса. (Таймер проверял "систему доступный" флаг каждую минуту).

0
ответ дан 6 December 2019 в 23:13
поделиться

Вот поздний ответ. В моем случае это было совсем другое.

Я попытался добавить хранимую процедуру в базу данных.

Query.SQL.Text :=
'create procedure [dbo].[test]' + #13#10 +
'@param int ' + #13#10 +
'as' + #13#10 + 
'-- For the parameter you can pick two values:' + #13#10 + 
'-- 1: Value one' + #13#10 + 
'-- 2: Value two';

Когда я удалил двоеточие (:), это сработало. Поскольку он рассматривал двоеточие как параметр.

2
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: