- ベストアンサー
【JSPのデータ型の変換エラー??】
こんばんは! 現在、SQL Serverのテーブルに接続してJSPのテキストボックスをキーに検索結果を次のJSPに表示させるWEBを作成しています。 そこで検索結果を表示させるJSPでnvercharの値'AHFKS23847'をデータ型intに変換できませんでした。と表示されます。 ネットや書籍で調べましたが全くでておらず困っております。 ご教授下さい! String param = request.getParameter("param"); "SELECT * FROM T_Table where Number_Co="+param); として記述しております。 Number_CoはSQL Serverではテキスト型と設定されております。 宜しくお願いいたします!
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ボタン毎にformを分けるのであれば // 得られた結果をレコードごとに表示 while (rs.next()){ %> <form method="post" action="次のJSP"> <input type="hidden" name="kanriId" value="<%= rs.getString("管理ID")%>"> <tr> <TD><span style="font-size:10pt;color:#336000">F7</span></TD> </tr> <tr> <td><input type="submit"></td> </tr> </form> <% } のような感じでループ内で生成すれば良いと思います。 formタグの位置によってレイアウトが若干崩れるかもしれませんので その際はformタグの位置を調整してみてください。
その他の回答 (9)
1・各ボタン毎にformを分ける ↓をボタン毎に記述する対応 <form method="post" action="次のJSP"> <input type="hidden" name="kanriId" value="管理IDの値"> </form> 2・formを1つにしたければjavascriptでhiddenタグにセット 例えば function setVal(karniId) { document.forms[0].kanriId = kanriId; } みたいなスクリプトを書いておいて、 サブミットボタンで下記要領でhiddenタグに値をセット <form method="post" action="次のJSP"> <input type="hidden" name="kanriId" value=""><!-- 管理IDをセットするhiddenタグ --> ~中略~ <input type="submit" onclick="setVal('管理IDの値')"> とかで如何でしょうか。
補足
ARIA9さま ありがとうございます☆ ボタン毎にformを分けたいと考えておりました。 その場合はこのJSPでループの際にformを作っていくイメージになるのでしょうか??(記述等はわかりませんが・・・) ご教授宜しくお願い致します♪
>契約番号_Coではなく管理IDでSQLを書きたいのですが。(SQL Serverではオートナンバー型です。) とのことですので、このSQLで取得した列に管理IDという列が存在し (*で全列取得していますが、その中に含まれているということでよろしいですよね?) その値を次のJSPへ渡して、次のJSPでは管理ID列をWHERE句に記述したいということでよろしいでしょうか? だとすると、このJSPページで <form method="post" action="次のJSP"> <input type="hidden" name="kanriId" value="管理IDの値"> </form> のような形式で値を次のJSPへ受け渡して、次のJSPではkanriIdの値を request.getParameterで取得してSQLを記述するなどが考えられます。 セッションや、クッキーに保持する方法もありますが、画面渡しと考えると 無駄にセッションに情報を持たせるよりはhiddenタグの方が良いかと思います。 解釈が違うようでしたら、ご指摘ください。
補足
ARIA9さま ありがとうございます☆ 認識はあってございます。 <TD><span style="font-size:10pt;color:#336000">F7</span></TD> の下へ上記、記述とボタンを作ってそのボタンを押すと次のJSPへ移動するイメージを思っています。 ループになっておりますので契約番号_Coに該当したレコードが複数でてきますのでvalue="管理IDの値"が既定ではない形になります。 ここでの記述をどの様にさせて頂ければいいのかわかりません。 度々、申し訳ありませんがご回答よろしくお願い申し上げます。
- fortranxp
- ベストアンサー率26% (181/684)
一般的にいえばrequestオブジェクトのparam値は 他のJSPへforwardしても変化するとは考え難いですね。
補足
ありがとうございます☆ それでは ("SELECT * FROM T_Transfer_Communication_Vote where 管理番号='"+ param +"'"); の様なSQLで別のJSPへの移動はできないという事でしょうか??
表示された際に文字化けしていて ブラウザの(IEと仮定して)表示メニュー→エンコードを指定すれば見れるということですか? だとするとMETAタグを付けて画面の文字コードを明示すれば解決するかもしれません。 <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 応答ヘッダ絡みかもしれませんので、確認できるようであれば 応答ヘッダでキャラクタセットが指定されているかも確認した方が良いでしょう。
補足
ARIA9さま ご回答ありがとうございます! >ブラウザの(IEと仮定して)表示メニュー→エンコードを指定すれば見れるということですか? はい。その通りです。 頂いたコードで文字化け解消されました☆ 本当にありがとうございます♪ ほんとに最後なのですが・・・ 今回は受け取ったデータを ("SELECT * FROM T_Transfer_Communication_Vote where 契約番号_Co='"+ param +"'"); で表示させていましたがこのJSPからPOSTで送って契約番号_Coを他の項目で受け取る事は可能なのですか?(このJSPから次のJSPで・・・) 契約番号_Coではなく管理IDでSQLを書きたいのですが。(SQL Serverではオートナンバー型です。) 教本などにも載っていないのでご存知でしたらご教授下さい!
- fortranxp
- ベストアンサー率26% (181/684)
もしかしたら、 String param = request.getParameter("param"); ↓ int param=Integer.parseInt(request.getParameter("param")); JSPでの型はNVERCHRなので文字型ですが 契約番号_Coはint型みたいですね。 でもText型が本当みたいなのでだめかも。。。。
補足
fortranxpさま 色々しまして String param = (request.getParameter("param")); とした所上手くいきました!! 本当にありがとうございます☆ しかし、表示された際には???の文字化けになります。 ブラウザのエンコードで直せばみれるのですが・・・ いい方法ありましたらご教授下さいませ☆
文字化けの件ですが、JSPファイルをUTF-8で保存していませんか? で、コンパイル時の文字コード指定がWindows-31J(もしくはShift_JIS)になっていたとすると 当該の文字化けが発生します。 現在、開発環境がないところですので実動作は確認できていませんが 「契約番号」をUTF-8でテキスト保存し、Shift_JISで開いたところ似たような化け方をしました。 JSPソースの文字コード、JSPページのエンコード、JSPコンパイルの文字コードは揃えておかないと文字化けの原因になりますよ。
補足
ARIA9さま ありがとうございます☆ 現在のソースは以下の通りです。 Windows-31Jで保存してございます。 SQLは)を付け解決致しました。 しかし、メインのJSPから以下のJSPにてPOSTにて値を送っているのですがString param = request.getParameter("param");にてシンボルが解決できませんとエラーがでます。 受け取りの記述が間違っていますでしょうか? ご教授頂けますようお願い致します! <%@page contentType="text/html; charset=Windows-31J"%> <%@page import="java.sql.*"%> <%! // サーブレットのinitメソッドに相当 public void jspInit() { try { // JDBCドライバをロード Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (Exception e) { e.printStackTrace(); } } %> <html> <head> <title>検索結果一覧</title></head> <BODY bgcolor="#ffffcc"> <span style="font-size:24pt;color:#cc99cc"><B>検索結果一覧</B></span> <TABLE border="3" BORDERCOLOR="#9999ff" cellspacing="1" cellpadding="1"> <TR> <TD><span style="font-size:10pt;color:#336000">F1</span></TD> <TD><span style="font-size:10pt;color:#336000">F2</span></TD> <TD><span style="font-size:10pt;color:#336000">F3</span></TD> <TD><span style="font-size:10pt;color:#336000">F4</span></TD> <TD><span style="font-size:10pt;color:#336000">F5</span></TD> <TD><span style="font-size:10pt;color:#336000">F6</span></TD> <TD><span style="font-size:10pt;color:#336000">F7</span></TD> </TR> <% // データベースへのアクセス開始 Connection con = null; Statement stmt = null; ResultSet rs = null; try { // データベースに接続するConnectionオブジェクトの取得 con = DriverManager.getConnection("jdbc:sqlserver://10.121.67.247:1433;DatabaseName=Name","ID","PW"); // データベース操作を行うためのStatementオブジェクトの取得 stmt = con.createStatement(); String param = request.getParameter("param"); // SQL()を実行して、結果を得る rs = stmt.executeQuery( "SELECT * FROM Table where 契約番号_Co='"+ param +'""); // 得られた結果をレコードごとに表示 while (rs.next()){ %> <tr> <td><%= rs.getString("F1")%></td> <td><%= rs.getString("F2")%></td> <td><%= rs.getString("F3")%></td> <td><%= rs.getString("F4")%></td> <td><%= rs.getString("F6")%></td> <td><%= rs.getString("F7")%></td> <td><%= rs.getString("F8")%></td> </tr> <% } } catch (Exception e) { e.printStackTrace(); // エラー表示プログラム out.write(e.getMessage()); } finally { // データベースとの接続をクローズ try { rs.close(); } catch (Exception e) {} try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} } %> </table> </body> </html>
C:\Program Files\Apache Software Foundation\Tomcat 5.0\work\Catalina\localhost\wl_jsp\org\apache\jsp\Search_jsp.java:88: ')' がありません。 ')'が足りないようですが? 私は「"SELECT * FROM T_Table where Number_Co='" + param + "'" 」答えましたが、 SQL文の部分を最小限の表現で書いたまでです。 意味を理解せず、そのままカット&ペーストして使っていませんか? "SELECT * FROM Table where 螂醍エ?逡ェ蜿キ_Co='"+ param +"'"; ですが、 文字化けはともかく(文字列内で発生しているため)、最後のセミコロンの前に')'がひつようなのではありませんか?
補足
marimari01さま ありがとうございます。 すみません。 SQLについても勉強不足な所があり完全に把握はできていなかったと思っております。 しかし、コピー&ペーストではなく自分で記述して("SELECT * FROM T_Table where Number_Co='" + param + "'");等もやってみてのエラーでした。 すみません。ご教授下さい。
JSPのエラーと言うよりはSQLのエラーですね。 Oracle専門でSQLServerは詳しくないのですが、 Number_Coという列の定義が文字列型でご質問のエラーがでているとすると No.1の方が仰っている通り、シングルクォートでパラメータを括らないことで暗黙の数値変換がかかっており 結果、変換不能でエラーになっています。 Number_Coという列の定義が数値型だったとすると パラメータの暗黙型変換が列の型に合わせて行われており 結果、変換不能でエラーになっています。 どちらのケースかは、実際ご確認ください。
お礼
ARIA9さま 前回に引き続き申し訳ございません・・・ 暗黙の数値変換ですか? 数値として処理されてしまうという事ですか! ご丁寧なご解説分かりやすかったです☆ ありがとうございます♪
"SELECT * FROM T_Table where Number_Co="+param); は "SELECT * FROM T_Table where Number_Co='" + param + "'" では?
お礼
marimari01さま 本日、実行した所エラーが出てしまいました。 2007-04-17 09:16:05 StandardWrapperValve[jsp]: サーブレット jsp のServlet.service()が例外を投げました org.apache.jasper.JasperException: JSPのクラスをコンパイルできません JSPファイル: /Search.jsp の中の32行目でエラーが発生しました 生成されたサーブレットのエラーです: C:\Program Files\Apache Software Foundation\Tomcat 5.0\work\Catalina\localhost\wl_jsp\org\apache\jsp\Search_jsp.java:88: ')' がありません。 "SELECT * FROM Table where 螂醍エ?逡ェ蜿キ_Co='"+ param +"'"; 螂醍エ?逡ェ蜿キ_Coの部分は契約番号という日本語なので文字化けしたのだと思います。 宜しくお願い致します!
補足
marimari01さま ' 'で囲むのですか? なるほど、上記の記述で再度挑戦してみます! ありがとうございます☆
お礼
ARIA9さま うまくできました!! 当初の質問とは違う質問にも丁寧にお答え頂きまして本当にありがとうございます☆ なるべく自分の力で勉強して進んで行きたいとは思いますが、もしも壁に当たった際にはまたご教授下さいませ。 本当にありがとうございました♪
補足
ARIA9さま ありがとうございます☆ それでString num = request.getParameter("kanriID");にて受け取れば いいと言う事ですね? なるほど! 記述までご教授頂き、本当にありがとうございます!! 1度チャレンジしてみます♪