- PR -

DBへのコネクションの確立

投稿者投稿内容
オガシン
常連さん
会議室デビュー日: 2006/05/23
投稿数: 31
投稿日時: 2006-05-31 14:02
luckseedさん,ukさん,末記人さん,返信ありがとうございます.

現在色々調べて考えているところですが,現在の時点でのソースを載せます.
なにかありましたら,指摘お願いします.

コード:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

import org.apache.struts.action.ActionForm;

public final class IchiranActionForm extends ActionForm
{
   private HashMap record = null;		// HashMap型のrecordマップを宣言
   private String softname;			// ソフトウェア名	(key = "SN")
   private String vername;			// Version	(key = "VN")
   private String makename;			// メーカー名	(key = "MN")
   private String license;			// ライセンス数	(key = "LN")
   private String limit;			// 有効期限	(key = "YN")
   private String delete;			// Deleteフラグ	(key = "DE")
	
   public void setSoftname(String softname)	{ this.softname = softname; }	// ソフトウェア名の setter メソッド 
   public void setVername(String vername)	{ this.vername = vername; }	// Versionの setter メソッド
   public void setMakename(String makename)	{ this.makename = makename; }	// メーカー名の setter メソッド
   public void setLicense(String license)	{ this.license = license; }	// ライセンス数の setter メソッド
   public void setLimit(String limit)	{ this.limit = limit; }		// 有効期限の setter メソッド
   public void setDelete(String delete)	{ this.delete = delete; }		// Deleteフラグの setter メソッド
	
   public String getSoftname()		{ return softname; }	// ソフトウェア名の getter メソッド
   public String getVername()		{ return vername; }		// Versionの getter メソッド
   public String getMakename()		{ return makename; }	// メーカー名の getter メソッド
   public String getLicense()		{ return license; }		// ライセンス数の getter メソッド
   public String getLimit()		         { return limit; }		// 有効期限の getter メソッド
   public String getDelete()		{ return delete; }		// Deleteフラグの getter メソッド

    public void beforeFirst() throws SQLException
    {
        try 
        {
           ResultSet rs = null;
           Context ctx = new InitialContext();
           DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/SOFTWARE_DB");
           Connection con = ds.getConnection();				
           Statement stmt = con.createStatement();	// ステートメントオブジェクトを生成
				
           String sql = "SELECT * FROM SOFTWARE_TBL WHERE ID=1";
           rs = stmt.executeQuery(sql);	// クエリーを実行して結果セットを取得
				
           softname = rs.getString("NAME");			// テーブルの"NAME"を"softname"に代入
           vername  = rs.getString("VERSION");			// テーブルの"VERSION"を"vername"に代入
           makename = rs.getString("MAKER");			// テーブルの"MAKER"を"makename"に代入
           license  = rs.getString("LICENSE_NO");		// テーブルの"LICENSE_NO"を"license"に代入
           limit    = rs.getString("EXPIRATION_DATE");	// テーブルの"EXPIRATION_DATE"を"limit"に代入
           delete   = rs.getString("DELETE_FLAG");		// テーブルの"EXPIRATION_DATE"を"limit"に代入
				
                rs.close();			// DBへのアクセスをクローズ
                stmt.close();
                con.close();
        }
		
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
	
     public IchiranActionForm()
     {
        record = new HashMap();
        record.put("SN",softname);			//ソフトウェア名をput
        record.put("VN",vername);			//Versionをput
        record.put("MN",makename);			//メーカー名をput
        record.put("LN",license);			//ライセンス名をput
        record.put("YN",limit);				//有効期限をput
        record.put("DE",delete);			//Deleteフラグをput
        }
        
    public HashMap getMapData()				//Map型のプロパティのgetメソッド
    {
         return record;						//recordを返す
    }
}

NIKE
会議室デビュー日: 2006/05/30
投稿数: 7
投稿日時: 2006-05-31 14:35
末記人さん・ukさんがおっしゃるとおり、
nextを実行してないからではないでしょうか。

rs = stmt.executeQuery(sql);

▼ここでnext実行しないと...

softname = rs.getString("NAME");

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/sql/ResultSet.html
オガシン
常連さん
会議室デビュー日: 2006/05/23
投稿数: 31
投稿日時: 2006-05-31 14:45
>>NIKEさん,返信ありがとうございます.
nextを実行してないから,と言うことで

コード:
    while(rs.next())
    {
      softname = rs.getString("NAME");
                :
                :



としましたが,同じエラーが出ます(泣

物分りが悪くてすみませんが,なにか気づいた点があったらお願いします.
ゴングラッチェ
常連さん
会議室デビュー日: 2006/03/03
投稿数: 36
投稿日時: 2006-05-31 15:06
引用:
"SELECT * FROM SOFTWARE_TBL WHERE ID=1";


このSQLをDBMS(mysql?)で直接実行して結果って得られてますか?望む結果が得られているでしょうか。ここのところも確認してみると幸せになれるかもしれません。
単純に結果のレコード件数が0件で、「レコードが1件も無いのに最初のレコードを指せなんていわれても無理でっせ旦那」と言ってるのかもしれませんよ。「んなぁ〜こたぁ〜ねぇよ」ってレスがつきそうですが。そのくらいしか思いつかんとですよ。「DBMSで実行してみたら、実はエラーでした」なんてことがあるやも・・・

[ メッセージ編集済み 編集者: ゴングラッチェ 編集日時 2006-05-31 15:08 ]
オガシン
常連さん
会議室デビュー日: 2006/05/23
投稿数: 31
投稿日時: 2006-05-31 16:25
>>ゴングラッチェさん,返信ありがとうございます.

使用しているDBはmysqlです.
mysqlを実行させて,SQL文を実行したところ,データは表示されました.
その文をコピペしてソースに載せたので,SQLの部分はクリアしていると思います.

何をやっても同じエラーが出るので,struts-config,server-xml,web-xmlや,
追加するjarファイルが足りないのかなぁと思ったりもしてます.
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-05-31 17:04
引用:

オガシンさんの書き込み (2006-05-31 14:45) より:
>>NIKEさん,返信ありがとうございます.
nextを実行してないから,と言うことで

コード:
    while(rs.next())
    {
      softname = rs.getString("NAME");
                :
                :



としましたが,同じエラーが出ます(泣

物分りが悪くてすみませんが,なにか気づいた点があったらお願いします.


本当に前と同じエラーですか? コードを変更した後Webアプリケーションの再デプロイ
もしくはTomcatの再起動は実行していますか?

環境の問題ではなく、コードの問題だと思います。現時点でのコードを載せてみて
もらえますか?
#直接関係ないとは思いますが、気づいたところでは例外発生時にコネクションなどの
#クローズ処理を実行していないようですね。
末記人
常連さん
会議室デビュー日: 2004/03/31
投稿数: 27
投稿日時: 2006-05-31 17:39
ukさんに同意。
同じエラーであればrs.next()漏れ以外では有り得ないかと。。
オガシン
常連さん
会議室デビュー日: 2006/05/23
投稿数: 31
投稿日時: 2006-05-31 18:57
>>未記人さん、ukさんお返事ありがとうございます。

一応、設定を見直して、足りないファイルがあったようです。
それを追加したところ、データは表示できました。

毎回トムキャットを再起動していたつもりでしたが、
頭がいっぱいっぱいになっていて、し忘れていたかもしれません。

ソースのほうですが、現在自宅に戻ってきてしまい、手元にない常態なので
明日UPしたいと思います。

貴重な時間を私の問題のために割いていただき本当にありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)