Результат запроса Delphi7 Master Detail Relationship в ORA-01036

Я использую Delphi7, драйвер Devart dbExpress 4.70.

Я удаляю два TSQLTable (назовем их A и B), два TDataSetProvider (dspA и dspB), два TClientDataSet (cdsA и cdsB), два TDataSource (dsA и dsB) и два DBGrids (gridA и gridB). Все нормально ставится. Если я установлю для cdsA.Active значение true, я смогу увидеть данные в gridA. То же самое на cdsB.

Теперь я хочу реализовать отношение

A JOIN B ON a = b.

Поле a является истинным внешним ключом A, на которое ссылается поле b B, а b также является первичным ключом B. Я установил материал следующим образом (я использую графические инструменты):

cdsB.MasterSource := dsA;
cdsB.MasterFields := a;
cdsB.IndexFieldNames := b;

Когда я делаю cdsB.Open, я получаю эту ошибку:

ORA-01036: недопустимое имя/номер переменной".

Значение поля a всегда равно null в таблице A (нет данных). TSQLMonitor сообщает о следующих запросах: Execute: select * from A

...

Execute: select * from ENTI where (b is NULL)

:1 (Number,IN) = <NULL>

Что я упустил и как это исправить?


person Francesco    schedule 24.11.2011    source источник
comment
Отредактируйте свой вопрос, чтобы включить полный оператор SQL, который вы выполняете.   -  person p.campbell    schedule 25.11.2011
comment
cdsA открывается раньше, чем вы открываете B?   -  person Tony Hopkinson    schedule 25.11.2011
comment
Поскольку вы используете конструктор, двойной щелчок на свойстве MasterFields в инспекторе объектов должен запустить 'Конструктор ссылок на поля'. См. также: Создание таблицы как детали другого Набор данных   -  person Sertac Akyuz    schedule 25.11.2011
comment
@ Тони Хопкинсон, да. Сначала я открываю cdsA, затем cdsB.   -  person Francesco    schedule 25.11.2011
comment
Я заменяю TSQLTable B на TSQLQuery B. Я установил оператор B как select * from B where b=:b. B.IndexFieldNames, B.MasterFields и B.MasterSource остаются прежними. Ну, если я использую TSQLQuery вместо TSQLTable, все работает нормально. Это странно.   -  person Francesco    schedule 28.11.2011


Ответы (1)


При использовании Datasnap вы должны установить отношение M/D для исходных наборов данных, а не для клиентских. Это создаст «поле набора данных» в основном наборе данных клиента. Затем вы назначаете это поле дочернему клиентскому набору данных. Этот подход также более производительный.

В любом случае, это тоже должно работать, похоже, что-то не так с вашим SQL.

person Community    schedule 25.11.2011