• ベストアンサー

javaのResultSetについて

javaのResultSetについてですが、getStringでSQL名を選択して取得するのですが、変数で指定した場合は、文字列と判断され取得できないのでしょうか? 例えばSQLの列名の「test」を取得したい場合は、「rs.getString(test)」と記述しますが、 以下のように変数に置き換えて、取得しようすると、 String test2 = "test"; rs.getString(test2)というようにすると、カラムがありませんとエラーが返ってきます。 変数に置き換えて実行したいのですが、何か良い方法がないかご教授いただけますでしょうか。 宜しくお願い致します。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

ResultSetクラスのgetString()メソッドの引数はint型(カラムインデックス)かString型(カラム名)のどちらかしかないので、 > 例えばSQLの列名の「test」を取得したい場合は、「rs.getString(test)」と記述しますが、 という書き方はできないのではないでしょうか? rs.getString("test")の誤りだとは思いますが…。 なお、 String test2 = "test"; rs.getString(test2); で値は取得できますよ。 取得しようとしているカラムの型と名前をもう再度確認してみて下さい。

tamanegin
質問者

お礼

String変数で使用しょうとしていたSQL列名を指定するのを忘れていただけでした・・・。 確認したら上手くいけました。 ありがとうございました!

関連するQ&A

  • WebSphere/DB2/ResultSet close/Exception

    WebSphereを使って、Listenerで取得したデータソースを利用していますが、 String sql1 = "SELECT A1 FROM TEST1"; String sql2 = "SELECT B2 FROM TEST2 WHERE B1 = ?"; Connection conn = datasource.getConnection(); PreparedStatement ps1 = conn.preparedStatement(sql1); ResultSet rs1 = ps1.executeQuery(); while(rs1.next()){ PreparedStatement ps2 = conn.preparedStatement(sql2); ps2.setString(1,rs1.getString("A1")); ResultSet rs2 = ps2.executeQuery(); ps2.close(); } このロジックで、ps2をクローズすると、ps1で取得したResultSet rs1がクローズされるというExceptionが発生してしまいます。 (ループして戻ったときにrs1.next()でexceptionが起こる) なにか対処方法があるかご存知の方いらっしゃいましたら、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaのResultSetについて

    現在、javaの勉強中です。 そこで、ResultSetについて質問があります。 私は、今まで主にC#で開発をやっていました。 C#だと、クライアント(WindowsForm) → Webサーバー → APサーバー → DB という構成で、サーバー間をデータセットでやり取りしていました。 ただ、javaは私のコーディングミスかもしれませんが、DBサーバーで取得した値を ResultSetに入れて、Connectionやら、StatementをCloseすると、ResultSetも消滅してしまっています。 こういう場合は、取得直後に、なにか別のクラス変数などに移し変えるのが正しいのでしょうか? ただ、そうなると、私の勝手な考えですが必要な列分の配列変数が必要なのでは?と、思ってしまっていて、 そうなると、ナンセンスだな・・・・と思っています。 ほかに何か良いやり方はあるのでしょうか? それとも、そもそも、DB接続の専用クラスというものはJavaに必要なのでしょうか? (上記のC#の考えでいけば、間のWebサーバーとAPサーバーが不要?) よろしくお願いします。

    • ベストアンサー
    • Java
  • getStringの値がNULLの時の処理

    DB:SQL Server 2005 JDBCを使ってデータベースへアクセスし、SQL発行して結果をResultsetに格納、getStringで各項目の値を取得するところまでは確認できています。 外部結合したテーブルを参照していおり、getString()でnullを取得した場合にjava.lang.NullPointerExceptionが返ってエラーとなってしまいます。 回避策はあるのでしょうか? 抜粋したソースを下記に記します。 -- test.jsp -- <% ResultSet rs = db.executeQuery(sql); while(rs.next()){ String disp_object = rs.getString("object"); if(disp_object == null) disp_object="---"; } %> <tr>Object</tr> <tr><%=disp_object%></tr>

    • ベストアンサー
    • Java
  • javaについて質問です。

    初めまして、情報系の大学に進学して課題を出されました、この接続クラスを使って全件表示させる、4件インサートする、2から4行目までを取得する実行クラスを作りなさいとの事で全く分からなくて悩 んでおります、どうかご教授お願いいたします。 mysqlにはすでにIDNO(3) Name Addressが 入ってる状態を想定して答えなさいとの事。。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; public class CatWalkhitomin{ //** データベースとのコネクションを作る変数 */ private Connection co; String url = "jdbc:mysql://localhost/reportdb?useUnicode=true&characterEncoding=SJIS"; String user = "root"; String password = "hitomin1995"; /** * DBに接続、トランザクション開始 */ public void connect() throws Exception{ Class.forName("com.mysql.jdbc.Driver"); co = DriverManager.getConnection(url, user, password); co.setAutoCommit(false); return; } public void disconnect() throws Exception{ co.close(); return; } public void commit() throws Exception{ co.commit(); return; } public void rollback() throws Exception{ co.rollback(); return; } /** * Insert、Update、Deleteを実行 * @param sql SQL文 * @return iCount 更新件数 */ public int updateExec(String sql) throws Exception{ PreparedStatement ps = co.prepareStatement(sql); //executeUpdateメソッドでsql文を実行し戻り値の更新件数をiCountに代入 int iCount = ps.executeUpdate();       return iCount; } /** * Select文を実行 取得した値を戻す * @param sql SQL文 * @return strData 取得した値 */ public String[][] select(String sql) throws Exception{       //sql文を実行する為のインスタンスをsql文select count(*) from numatatableで生成。 PreparedStatement ps = co.prepareStatement("select count(*) from numatatable"); //executeQuerymメソッドでsql文を実行。読み込んだデータの中身をrsに代入 ResultSet rs = ps.executeQuery(); rs.next(); //next()で行データを読み込む準備 int rowCount = rs.getInt(1) ;//rowCountへnumatatableの行数を代入 //selectExecメソッドの第二引数を0、第三引数をrowCountとして全ての行データを二次元関数にしてreturn return selectExec(sql, 0, rowCount); } /** * Select文を実行 取得した値を戻す * @param sql : SQL文 <br> fromIndex : 取得開始行 * @return strData : 取得した値 */ public String[][] select(String sql, int fromIndex) throws Exception{ PreparedStatement ps = co.prepareStatement("select count(*) from numatatable"); ResultSet rs = ps.executeQuery(); rs.next(); //next()で行データを読み込む準備 int rowCount = rs.getInt(1); return selectExec(sql, fromIndex, rowCount); } /** * Select文を実行 取得した値を戻す * @param sql : SQL文 <br> fromIndex : 取得開始行 <br> toIndex : 取得終了行 * @return strData : 取得した値 */ public String[][] select(String sql, int fromIndex, int toIndex) throws Exception{ PreparedStatement ps = co.prepareStatement(sql); ResultSet rs = ps.executeQuery(); ResultSetMetaData met = rs.getMetaData(); //テーブルの列の数を取得して変数coulumに代入 int coulum = met.getColumnCount(); // 1行分ずつ全てのデータを格納する為のArrayList ArrayList<String[]> al = new ArrayList<String[]>(); while(rs.next()){ //rsの全てのデータを読み込むまでループ //getRow()で現在の行を取得し、メソッドの第二引数の取得開始行以上かつ、第三引数以下であればtrue if(rs.getRow() >= fromIndex && rs.getRow() <= toIndex){ String[] str = new String[coulum]; //1行分のデータをString[]に格納 for(int i = 0; i < coulum; i++){ str[i] = rs.getString(i + 1); } al.add(str); //ArrayListにデータを1行分づつadd } } // 読み込んだ全てのデータが入っているArrayListを二次元配列に変換 String[][] strData = al.toArray(new String[al.size()][]); return strData; //変換した上記のデータをreturn } }

    • ベストアンサー
    • Java
  • javaにてデータ取得

    JAVAカテゴリーで質問しようかこちらにしようか迷ったのですが。。。 あるテーブルを以下の様に内部結合しています。 select * from t_table a, t_table b where a.id=b.id and a.no=0 and b.no=1 この時、t_tableのあるカラムtestcolを取得したいとおもっております。 言語はjavaで、データベースはpostgreSQLです。 rs.getString("testcol"); rsはResultSetオブジェクトです。 これで、データは取得できるのですが、条件のt_tableの別名aのデータ が取得されます。別名bの方を取得したいと思い、単純に rs.getString("b.testcol"); 等としたら、「カラム名がありません」というエラーになりました。 getStringのパラメータとして、カラムインデックス(数値)も 指定できるので、それで行うと取得可能でした。 カラムインデックス指定ですと、プログラムのメンテナンス上支障をきたす ので、なんとか、カラム名の指定で行いたいと思っておりますが、 どうすればいいのでしょうか?

  • ResultSetについて

    ResultSet オブジェクト(以下、rs と呼ぶ)を例えば SQL="select * from tableA" のようなSQLを発行して作成し、作成されたrs からtableAの全Entity(すべての列の要素名)を逆検索する方法は可能なのでしょうか?

    • ベストアンサー
    • Java
  • データ数をカウントしたいのですが

    JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは Connection con = null; String sql = "select count(*) from テーブル名"; // コネクションを作成する。 con = DriverManager.getConnection(url, user, pass); Statement st = con.createStatement(); // SQLを実行する。 ResultSet rs = st.executeQuery(sql); String count = rs.getString("count(*)"); 実行した結果上手く出来ないのですが、この部分での間違いはありますか?

    • ベストアンサー
    • Java
  • ResultSetオブジェクトのメソッドについて

    AccessでつくったRDBにJDBCで接続してデータを表示させたいのですが、ResultSetオブジェクトのprevious()メソッドやfirst()メソッドを使うとうまくいまず困ってます。 下記のプログラムを実行するとエラーになります。 ------------------------------------------------ (省略) int r = 0; while(resultset.next()){ r++; } while(resultset.first()){ } ------------------------------------------------ 又は ------------------------------------------------ (省略) int r = 0; while(resultset.next()){ r++; } while(resultset.previous()){ String 変数名 = resultset.getString("フィールド名"); // タイトル名を取得/ (省略) ------------------------------------------------ エラー ----------------------------------------------- javax.servlet.ServletException: Result set type is TYPE_FORWARD_ONLY ----------------------------------------------- #カーソルのバックはできない? next()メソッドを使った後に、取得したデータの処理はどの様にすればよいのかがわかりません。 ご教授お願いします。

    • ベストアンサー
    • Java
  • Java PostgreSQL スクリプトレット

    スクリプトレットを使用し、ログイン画面を作成しようと考えています。 <%@ page import="java.io.*,javax.servlet.*,javax.servlet.http.*,java.net.*,java.sql.*" %> <% request.setCharacterEncoding("Shift_JIS"); String id = (String)request.getParameter("id"); String pass = (String)request.getParameter("pass"); String drv = "org.postgresql.Driver"; String dsn = "jdbc:postgresql://localhost:5432/?user=postgres&password=aipo"; String sql = "SELECT * FROM TURBINE_USER"; Connection cn = DriverManager.getConnection(dsn); Statement st = cn.createStatement(); ResultSet rs = st.executeQuery(sql); while (rs.next()) { out.println("<P>" + rs.getString(1) + "</P>"); } rs.close(); st.close(); cn.close(); %> 上記を実行すると org.apache.jasper.JasperException: Exception in JSP: /get.jsp:18 となり、 ResultSet rs = st.executeQuery(sql); の時点でエラーとなります。 Statement st = cn.createStatement(); まで正常に動作するのは確認済みです。 類似する質問に http://oshiete1.goo.ne.jp/qa3522131.html がありましたが、解決できませんでした。 どこが間違っていますでしょうか。

  • メモリリーク(?)時にSQLException

    メモリリーク(?)時にSQLException 初めて質問させていただきます。 java+mysqlでWebアプリを作成しているのですが、DBからデータ取得後、取得結果をStringに格納するところで2回に1回だけエラーとなってしまいます。 具体的には下記のようなプログラム実行時にSQLExceptionが出てしまいます。 // ---- プログラム // ・・・(略)・・・ String str = ""; rs = pst.executeQuery(); while (rs.next())} str = str + rs.getString("name"); } // ---- 出力されるエラー(途中まで) java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:644) at com.mysql.jdbc.ResultSet.next(ResultSet.java:6663) ResultSetがクローズされてるよというエラーだと思うのですが、 str = str + rs.getString("name"); のところを str = rs.getString("name"); に書き換えた場合と、String型ではなくStringBufferでappendを使って文字列連結させていった場合はエラーになりません。 また、ログを入れて動作状況を確認してみたところwhile文は何回かは動いているようです。 ※while文は5000回以上ループし、strは最終的にかなり大きいサイズになります。 このような状況を考えると、メモリリークが発生して落ちているのかと思うのですが、発生しているエラー内容は上記の通りSQLExceptionです。 また、一番腑に落ちないのはこのエラーが2回に1回だけ出る、ということです。 同じような現象をご存知の方がいらっしゃいましたら、何が起こっているのか教えていただけないでしょうか? 未熟ながら私の予想ですと、メモリリークが発生する前にjavaがGCでメモリクリアしようとしているんだけど、そのときにResultSetも一緒に消しちゃってる・・・? javaやjdbcのバグ???とも考えているのですが、どうやって確認したらいいのかわからず困っています。

    • ベストアンサー
    • Java

専門家に質問してみよう