SQL Server / T-SQL через JSP: «Не удалось связать многоэлементный идентификатор XX.YY» - PullRequest
0 голосов
/ 18 марта 2009

Я получаю сообщение об ошибке:

 the multi-part identifier "IC.industry" could not be bound

при выполнении этого запроса SQL со страницы JSP через JDBC:

select C.company, C.shname, C.fullname, count(d_to_c.designer)
from companies C
     left join ind_to_c IC on C.company = IC.company
     left join d_to_c on C.company= d_to_c.company
where IC.industry = ?
group by C.company, C.shname, C.fullname
order by C.shname

и я пытаюсь запустить его как подготовленный оператор, где я устанавливаю параметр с помощью (например) stmt.setObject(1, 7) перед запуском stmt.executeQuery().

Теперь, что странно: если я выполню это с ? и установлю параметр, как я только что упомянул, я получу ошибку «не удалось связать». Однако если я просто изменю запрос и жестко закодирую число 7 в текст запроса, это сработает!

Так что что-то связано с привязкой этого параметра.

Но я не могу понять, что.

Кто-нибудь?

ОБНОВЛЕНИЕ : По запросу, определение таблицы для ind_to_c:

 industry - int(11)
 company - int(11)

(это просто таблица, которая определяет отношения m2m между отраслями и компаниями)

ОБНОВЛЕНИЕ 2 : Также по запросу полный код JSP. Мне пришлось извлечь это из обращения к абстракции соединения с базой данных (которую мы используем для хранения подготовленных операторов и т. Д.

// conn был инициализирован как объект соединения с БД.

int parent_id = 7;
PreparedStatement ps = conn.prepareStatement("select C.company, C.shname, C.fullname, count(d_to_c.designer) from companies C left join ind_to_c IC on C.company = IC.company left join d_to_c on C.company = d_to_c.company where IC.industry = ? group by C.company, C.shname, C.fullname order by C.shname");
ps.setObject(1, parent_id);
ResultSet rs = null;
rs = ps.executeQuery();

Ответы [ 5 ]

2 голосов
/ 18 марта 2009

Какой тип данных для промышленности? Имеет ли это значение, если вместо этого вы используете специфичные для типа методы связывания, такие как stmt.setInt(1,7)?

edit: также не имеет отношения к вопросу, но вам, вероятно, следует удалить C.cid из SELECT. В некоторых вариантах T-SQL будет подразумеваться, что вы хотите сгруппировать по этому столбцу, поскольку он не является объектом функции агрегирования, даже если вы не указали его в предложении GROUP BY.

Возвращаясь к теме, вы можете опубликовать определение таблицы для ind_2_c? Природа ошибки, по-видимому, указывает на то, что в ней нет столбца с именем industry.

0 голосов
/ 19 марта 2009

Я обновил драйвер JDBC MS-SQL до версии 2.0, и он волшебным образом сработал.

0 голосов
/ 19 марта 2009

Я вижу из ваших комментариев, что вы можете использовать только SetObject.

Но почему вы передаете массив объектов вместо одного объекта? (если я правильно читаю Java)

0 голосов
/ 19 марта 2009

Может быть, я просто думаю о простом здесь, потому что я не очень хорошо знаю JSP, но не хотел бы просто работать:

int parent_id = 7;
PreparedStatement ps = conn.prepareStatement("select C.company, C.shname, C.fullname, count(d_to_c.designer) from companies C left join ind_to_c IC on C.company = IC.company left join d_to_c on C.company = d_to_c.company where IC.industry = ? group by C.company, C.shname, C.fullname order by C.shname");

ps.setInt(1, parent_id );

ResultSet rs = null;
rs = ps.executeQuery();
0 голосов
/ 18 марта 2009

Вы пытались передать именованный параметр (т.е. @industry) вместо знака вопроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...