Ошибка неправильно определен объект parameter

I’ve had a chance to try this with a compiler :) I must install one at home sometime.

While I still find your use of WITH unusual, it does seem to work OK.

I have seen the error you are getting in several cases:

  1. Trying to run more than one query
    against a connection at once (due to threading or a timer + processMessages)
  2. With TADOStoredProc when the ProcedureName is incorrect
  3. Sometimes if ADO cannot parse the query — can’t test this without your DB schema.

Note that there is no need in SQL Server to explicitly define the parameter type. These are automatically assigned by a OnChanged event attached to the SQL TStringList object.

As a result, it is best to either assign the SQL.Text property (as you do), or if using .Add(‘SELECT …’), use a SQL.BeginUpdate/SQL.EndUpdate pair.

Original reply:

  with AQ_Query do
  begin
    try
      AQ_Query := TADOQuery.Create(nil);
      ConnectionString := strConnectionString;

While this seems to work, it seems a bit strange to refer to an object before you instantiate it.

AQ_Query should be instantiated before the with statement:

  AQ_Query := TADOQuery.Create(nil);
  with AQ_Query do
  begin
    try
      ConnectionString := strConnectionString;

Better yet don’t use WITH — It’s asking for trouble.

Also note that object creation should be BEFORE a try..finally. As written you would have a compiler warning. Don’t ignore these — they help you write better code.

naon

1 / 1 / 1

Регистрация: 11.09.2013

Сообщений: 268

1

11.12.2016, 22:17. Показов 18233. Ответов 13

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Пишу запрос:

SQL
1
2
3
SELECT S.Nom_zak, S.Nazv_r, S.Kolv,S.FIO, S.Dat_n,S.Dat_o,S.Vipln
FROM Sost S,Zakaz Z, Sotryd SD,Praist  P
were  S.Fio_z = Z.Fio_z AND S.Fio = SD.Fio AND S.Nazv_r = P.Nazv_r  AND S.FIO=:S.FIO

Сначала была ошибка » ошибка синтаксиса во FROM». После же стало писать «неправильно определен объект parameter предоставлены несогласованные илине полные сведения».

Подскажите в чем ошибка?



0



1073 / 986 / 340

Регистрация: 07.08.2012

Сообщений: 2,790

11.12.2016, 22:36

2

Цитата
Сообщение от naon
Посмотреть сообщение

AND S.FIO=:S.FIO

А это как понимать? Источник ошибки, видимо, здесь.



0



naon

1 / 1 / 1

Регистрация: 11.09.2013

Сообщений: 268

11.12.2016, 22:46

 [ТС]

3

Цитата
Сообщение от Скандербег
Посмотреть сообщение

А это как понимать? Источник ошибки, видимо, здесь.

Я хочу сделать отчет в Rave по параметрическому запросу. Сам код юнита:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
unit Unit18;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, RpCon, RpDefine, RpRave, RpConDS;
 
type
  TForm18 = class(TForm)
    rvprjct1: TRvProject;
    btn2: TButton;
    cbb1: TComboBox;
    lbl1: TLabel;
    btn1: TButton;
    qry1: TADOQuery;
    con1: TRvDataSetConnection;
    procedure FormShow(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form18: TForm18;
 
implementation
uses unit2;
{$R *.dfm}
 
 
procedure TForm18.FormShow(Sender: TObject);
begin
cbb1.Clear;
unit2.DM.tbl2.First;
while not unit2.DM.tbl2.Eof do
  begin
  cbb1.Items.Add(unit2.DM.tbl2['FIO']);
  unit2.DM.tbl2.Next;
  end;
cbb1.Sorted:=true;
cbb1.ItemIndex:=0;
end;
procedure TForm18.btn1Click(Sender: TObject);
begin
Form18.Close;
end;
 
procedure TForm18.FormActivate(Sender: TObject);
begin
qry1.Active := true;
end;
 
procedure TForm18.btn2Click(Sender: TObject);
begin
With qry1 do
   begin
   Close;
   Parameters.ParamByName('S.FIO').Value:=  cbb1.Items[cbb1.ItemIndex];
   Open;
   end;
rvprjct1.Execute;
end;
 
end.

Но даже убрав то что Вы сказали пишет ошибка синтаксиса во FROM



0



1073 / 986 / 340

Регистрация: 07.08.2012

Сообщений: 2,790

11.12.2016, 22:56

4

Параметры с точками не пишут.
Недоумение вызывает и то что в запросе используется неявное объединение данных нескольких таблиц, но тем не менее содержит выходные поля только из одной таблицы.
Логика такого запроса в чем?



0



YuryK

1039 / 855 / 335

Регистрация: 08.12.2016

Сообщений: 3,283

12.12.2016, 02:42

5

Лучший ответ Сообщение было отмечено naon как решение

Решение

Цитата
Сообщение от naon
Посмотреть сообщение

were

SQL
1
WHERE

Добавлено через 3 минуты

Цитата
Сообщение от naon
Посмотреть сообщение

Parameters.ParamByName(‘S.FIO’).Value

Цитата
Сообщение от naon
Посмотреть сообщение

AND S.FIO=:S.FIO

SQL
1
AND S.FIO=:FIO
Delphi
1
Parameters.ParamByName('FIO').Value :=



1



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,857

12.12.2016, 03:36

6

Цитата
Сообщение от Скандербег
Посмотреть сообщение

Недоумение вызывает и то что в запросе используется неявное объединение данных нескольких таблиц, но тем не менее содержит выходные поля только из одной таблицы.
Логика такого запроса в чем?

Присоединяюсь. Мне тоже не понятна сия логика.



0



1 / 1 / 1

Регистрация: 11.09.2013

Сообщений: 268

15.12.2016, 10:51

 [ТС]

7

С этим разобрался. Спасибо. Но возник другой вопрос. В комбобоксе некоторые поля повторяются. То есть сколько раз они упоминаются в таблице tbl2 столько раз они отображаются в комбобоксе. Как сделать что бы они отображались по 1 разу?



0



Модератор

4206 / 3046 / 581

Регистрация: 21.01.2011

Сообщений: 13,190

15.12.2016, 10:55

8

Цитата
Сообщение от naon
Посмотреть сообщение

Как сделать что бы они отображались по 1 разу

DISTINCT



0



1 / 1 / 1

Регистрация: 11.09.2013

Сообщений: 268

17.12.2016, 00:38

 [ТС]

9

Цитата
Сообщение от Grossmeister
Посмотреть сообщение

DISTINCT

А это где найти можно? или куда прописывается?



0



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,857

17.12.2016, 02:02

10



0



1 / 1 / 1

Регистрация: 11.09.2013

Сообщений: 268

17.12.2016, 15:28

 [ТС]

11

Спасибо, но это слегка не то что я имел ввиду. По вашему совету это прописывается в SQL, и отражается в самом отчете.
А я имел ввиду: В данный момент в комбобоксе отображаются надписи допустим » 1,1,1,2,2,1,2.»А хотелось бы что бы было так «1,2». Как это сделать?



0



5095 / 4106 / 1029

Регистрация: 29.08.2013

Сообщений: 26,054

Записей в блоге: 3

17.12.2016, 16:15

12

вы или выгружайте в Combobox так как вам надо
или уже после выгрузки обрабатываете



0



naon

1 / 1 / 1

Регистрация: 11.09.2013

Сообщений: 268

17.12.2016, 17:04

 [ТС]

13

Цитата
Сообщение от qwertehok
Посмотреть сообщение

выгружайте в Combobox

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm18.FormShow(Sender: TObject);
begin
cbb1.Clear;
unit2.DM.tbl2.First;
while not unit2.DM.tbl2.Eof do
  begin
  cbb1.Items.Add(unit2.DM.tbl2['FIO']);
  unit2.DM.tbl2.Next;
  end;
cbb1.Sorted:=true;
cbb1.ItemIndex:=0;
end;

Вот я при открытии формы заполняю комбобокс. Но как ограничить повторения?



0



5095 / 4106 / 1029

Регистрация: 29.08.2013

Сообщений: 26,054

Записей в блоге: 3

17.12.2016, 19:59

14

Цитата
Сообщение от naon
Посмотреть сообщение

Но как ограничить повторения?

1. написать запрос что бы в нем не было повторений
2. при добавлении проверять через Items.IndexOf() наличие таких Итемов



1



Неправильно определен объект Parameter. Предаставлены неполные или несовместимые сведения.

Ошибка возникает при выполнении процедуры

Код:

qryWork_Insert.ExecSql;
  {-запрос-}
         qryWorker_Insert.SQL.Text :=
    format(‘INSERT INTO Workers (worker_id, passport_num, person_num, family, name, patronymic, reg_td, date_reg, name_firm, end_td, add_inf) ‘+
    ‘ VALUES (%s, %s, %s, %s, %s, %s, :p_d1, :p_d2, %s, :p_d3, %s)’,
    [VartoStr(unqID), QuotedStr(Trim(edtPassport.Text)),QuotedStr(Trim(edtPersonNum.Text)), QuotedStr(Trim(edtFamily.Text)), QuotedStr(Trim(edtName.Text)),
     QuotedStr(Trim(edtPatronymic.Text)), QuotedStr(Trim(edtFirmName.Text)),QuotedStr(Trim(edtAddInfo.Text))]);


Форум программистов Vingrad

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> ADOQuery «Неправильно опеределен объект Parameter», Выгрузка данных из FireBird 2.5 в DBF 

V

   

Опции темы

GraNit
Дата 30.11.2022, 09:29 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет

Здравствуйте, уважаемые форумчане!
Ох долго же меня тут не было smile)) А тут понадобилось процедурку набросать выгрузки данных из FireBird в DBF-файлы, а навык уже не тот smile))
Ладно, в сторону лирику.
Проблема в следующем: при выполнении запроса

Код

Insert into "MYFile.DBF" (FILIAL_N, ID_CONTR, ACC_DATE, PRC, INSR, STRG, PEN) VALUES (:Param1, :Param2, :Param3, :Param4, :Param5, :Param6, :Param7)

Получаю ошибку: Неправильно определен объект Parameter. Предоставлены несогласованные или не полные данные.
Более глубокое изучение проблемы выявило то, что при передаче данных вот здесь:

Код

     // myQuery - результат запроса в FireBird
     // ADOQuery - запрос который представлен выше, он пишет данные в DBF
     while not myQuery.Eof do
        begin
          for j := 0 to myFieldsCount do // Переберем все столбцы в результате запроса FireBird. Данные переменной уже меньше на 1
              begin
                myParamName := 'Param'+IntToStr(j+1); // Сформируем имя параметра
                  Form1.ADOQuery1.Parameters.ParamByName(myParamName).Value := myQuery.Fields[j].Value   //Здесь мы передаем данные в вышеуказанный запрос
          end;
          Form1.ADOQuery1.ExecSQL; //Вот здесь получаю ошибку, т.е. при записи данных в файл.
         myQuery.Next;
      end;

некоторые данные имеют значение nil. Видать ADOQuery это не устраивает и он ругается.
Не могу понять, как заставить данные принять нормальный вид, т.е. есть это целое число, то «0», если строка то пустая строка. Если идея проверять тип данных в поле и приводить данные параметра к этому типу, но по моему будет слишком громоздко. Может есть более изящный и красивый путь?
Что скажете? Прошу помощи.

PM MAIL   Вверх
GraNit
Дата 1.12.2022, 13:01 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет

Дополню.
Получается, что результат запроса из FireBird-а содержит некоторые записи с пустыми значениями полей, т.е. они не имеют значений. По этой причине значение равно NULL, т.е. не ноль, а не имеет значения. Соответственно, когда я передаю данные значения в виде параметра во время переноса данных, то получаю эту ошибку.
Надо бы заполнять значениями во время запроса…

…тихо сам с собою, я веду беседу…  smile

PM MAIL   Вверх
GraNit
Дата 1.12.2022, 20:09 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 55
Регистрация: 20.10.2007

Репутация: нет
Всего: нет

Все решил я проблему. В запросе использовал Coalesce(); Теперь все поля у меня заполнены значениями.

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Базы данных и репортинг»
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »

 
moybobr ©
 
(2006-11-27 12:57)
[0]

Кто работал с параметрами для TADOQuery.

Подскажите, если кто знает как задать параметр с одним и тем же именем для TADOQuery, причем в запросе на этот параметр несколько ссылок.

Есть запрос к Ораклу. В запросе есть параметры, причем один и тот же параметр в запросе встречается несколько раз (Например
select * from
   (select * from table1 where arcdate=:bdate) a1,
    table2 a2
 where a1.id=a2.id and a2.arcdate=:bdate).

Параметры задаются программно.

ADOQuery.Params.ParamByName(«bdate»).Value:=»21/12/2006″;
ADOQuery.Open;

Втаком случае выдается ошибка: «Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения»

Проблема в том, что т.к. в запросе 2 параметра, то их необходимо явно задать.

ADOQuery.Params.Items[0].Value:=»21/12/2006″;
ADOQuery.Params.Items[1].Value:=»21/12/2006″;
ADOQuery.Open;

При отлдаке, смотрю в Object Inspector оба параметра заданы, но ошибка та же.

Если же значения параметров задать статически запрос отрабатывает.

Если изменить запрос и вместо bdate записать :bdate1 и :bdate2
и в программе соответственно

ADOQuery.Params.Items[0].Value:=»21/12/2006″;
ADOQuery.Params.Items[1].Value:=»21/12/2006″;
ADOQuery.Open;

То все работает.

Запрос сложный, используется bdate несколько раз. Поменять на bdate1 … bdateN  я не могу, т.к. ухудшиться его время выполнения. Проверял.

Подскажите, если кто знает, как задать параметр с одним и тем же именем для TADOQuery, причем в запросе на этот параметр несколько ссылок.


 
Stanislav ©
 
(2006-11-27 13:28)
[1]

Использовать переменные сервера.
незнаю как в оракле в MS SQL так:
declare @A int

set @a= :par

select …,@a from … where pole1=@a or pole2=@a
и т.д.


 
k2 ©
 
(2006-11-27 13:41)
[2]

а тип какой у arcdate, bdate, bdate1, bdate2?


 
moybobr ©
 
(2006-11-27 13:58)
[3]

to stanislav:
да, действительно можно использовать переменные ораклa.
declare
bdate date;
begin
….
select into ….
….
end;
В таком случае получается PL/SQL блок. Который не выполняется в TADOQUERY просто так, поскольку TADOQUERY должна возвращать результирующее значение. Здесь можно через курсор, но это излишняя сложность.

to k2:
типы у arcdate,bdate,bdate1, bdate2 одинаковые


 
k2 ©
 
(2006-11-27 14:00)
[4]

одинаковые какие? :) даты или варчары


 
Stanislav ©
 
(2006-11-27 14:04)
[5]

а в TADODATASET ?
на MS SQL работает нормально, только не редактируемый набор данных получается.


 
moybobr ©
 
(2006-11-27 14:32)
[6]

to k2:
Даты. Хотя в примере приведено как варчар, но в самой программе begindate_DTP.DateTime, где begindate_DTP: TDateTimePicker;


 
moybobr ©
 
(2006-11-27 16:34)
[7]

Спасибо всем. Проблема решена путем полной программной инициализации всех параметров:

bal_Q.Parameters.Items[i].Direction:=pdInput;
bal_Q.Parameters.Items[i].DataType:=ftDateTime;
bal_Q.Parameters.Items[i].Value:=main_fm.begindate_DTP.DateTime;


Понравилась статья? Поделить с друзьями:
  • Ошибка нет доступа к c program files
  • Ошибка неправильно зарегистрированный набор ключей код ошибки 0x8009001a
  • Ошибка нет доступа или файл уже используется
  • Ошибка неправильно задано имя папки
  • Ошибка нет документов на отправку