2009-03-18 20 views
0

を "マルチパート識別子XX.YYをバインドできませんでした" 私はエラーを取得しています:SQL Serverの/ T-SQL:

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

を経由してJSPページからこのSQLクエリを作成するとき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をクエリのテキストにハードコードすれば、それは機能します!

だから、そのパラメータのバインドにはの何かをとする必要があります。

しかし、私は何かを理解できないようです。

誰か?

UPDATE:要求ごと、ind_to_cのためのテーブル定義:

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

(それは業種や企業間のM2Mの関係を定義するだけで、テーブルの)

UPDATE 2:またあたり要求、完全なJSPコード。私は、connはDB接続オブジェクトとして初期化されている//

など、私たちが準備された文を格納するのに使用するデータベース接続(の抽象化への呼び出しのうち、これを引っ張っていた。

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(); 

答えて

2

業界のためのデータ型は何あなたの代わりにstmt.setInt(1,7)のようなタイプの特定のバインド・メソッドを使用している場合、それは違いを生むん

編集:また、質問には関係ありませんが、おそらくSELECTからC.cidを削除する必要があります。 T-SQLのいくつかの亜種は、それがGROUP BY節に指定されていなくても、集約関数の対象ではないので、その列でグループ化したいと推測します。

トピックに戻ると、ind_2_cのテーブル定義を投稿できますか?エラーの性質は、industryという列がないことを示しているようです。

+0

実際には、私はそれをテストすることができません - setObjectにアクセスできるフレームワーク(looongストーリー)を通して操作する必要があります。はい、私はそれが愚かだと思います。とにかく、私はsetObjectを使う必要があります。 – DanM

+0

(業界はint(11)です) – DanM

+0

C.idはtyp_2であり、ind_to_cを読み込んでいるはずです。この投稿の目的のためにいくつかの列/表の名前を変更しました。また、テーブルdefを掲載しました。 – DanM

0

あなたが名前付きパラメータ(すなわち:@industry)を通過しようとしたことがありますか?代わりに疑問符の

+0

いいえ - JSP/JDBCのコンテキストではどうしますか?私は疑問符のプレースホルダを "@industry"に置き換えようとしましたが、それをプレースホルダとして認識していないようです。 – DanM

0

たぶん私は私がうまくにJSPを知らないので、ここだけの単純なに考えていますが、動作しないだけで、DITなります

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

私はあなただけのsetObjectを使用することができますあなたのコメントからご覧ください。

しかし、なぜ単一のオブジェクトの代わりにオブジェクト配列を渡すのですか?(私が正しくJavaを読んでいる場合)

+0

私はそうではありません、それはタイプミスでした...私は準備されたstmtsを保存するために使用するオブジェクト構造からこのコードをすべて抜き出し、他の高レベルのものを行います...そして、パラメータを渡す方法そのフレームワークはオブジェクト配列を経由しています。誤って1つのオブジェクトではなく配列として残しました。おっとっと! – DanM

+0

(つまり、今質問に表示されているコードは正しいコードであり、それと同じ問題があります)。 – DanM

0

私はMS-SQL JDBCドライバの新しいバージョン2.0にアップグレードし、魔法のように動作しました。

関連する問題