プログラム処理について質問です

このQ&Aのポイント
  • プログラム処理に関する問題が発生しました。ユーザーが選択した言語のアップデート処理で、一回目の登録言語を除外するとtruth_valueを変更できない問題があります。
  • 解決策として、一回目の登録言語を除外した場合でも、truth_valueを0に変更できるような処理が必要です。
  • 現在のコードでは、選択された言語リストを取得し、データベースの言語テーブルをアップデートする処理を行っています。
回答を見る
  • ベストアンサー

プログラム処理について質問です

お世話になります。 開発環境 データベース :: MySQL プログラム言語 :: Java SE7 フレームワーク :: Java EE 7 データベース設計概要 テーブル名所 language_code :: ja, zh-cn, zh-hk, ...その他言語コード locale :: 日本語、中国語(簡体)、中国語(香港)、...その他言語 truth_value :: 0 または、1 *truth_valueには、デフォルトで0を指定してます。 アプリケーション概要 ユーザーが複数の言語から使用する言語を選択して、選択した言語に紐付くコンテンツを作成するというものです。 プログラム処理について ユーザーが選択した複数の言語をサーブレットで取得しました。その後、取得したデータがNULLでないことを確認したうえで、データをDAOクラスに渡しプリペアードステートメントでアップデート処理をしました。 問題は、この処理だとユーザーが何らかの理由(誤操作)で、一回目に登録した言語を除外した場合、1から0にtruth_valueを変更できないということです。この問題を解決するにはどのような処理が必要としますか。皆様の知恵を御貸し下さい。よろしくお願いします。 実際のコードとユーザーが使用する画面の添付ファイルを載せてます。 サーブレット protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, Exception { List<LanguageDTO> useLanguageList = new ArrayList<LanguageDTO>(); LanguageDTO useLanguage = null; String[] selectLanguages = request.getParameterValues("selectLanguage"); if(selectLanguages != null){ for(String lang : selectLanguages){ useLanguage = new LanguageDTO(); useLanguage.setLanguageCode(lang); useLanguageList.add(useLanguage); } LanguageDAO.updateLanguage(useLanguageList); } } DAOクラス public static void updateLanguage(List<LanguageDTO> useLnaguageList) throws Exception{ Connection db = null; PreparedStatement ps = null; try{ Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("jdbc/ecommerce"); db = ds.getConnection(); ps = db.prepareStatement("update language_codes set truth_value = ? where language_code = ?;"); for(LanguageDTO useLanguage : useLnaguageList){ ps.setBoolean(1, useLanguage.getTruthValue()); ps.setString(2, useLanguage.getLanguageCode()); ps.executeUpdate(); } } catch (Exception e) { e.printStackTrace(); } finally { if(ps != null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(db != null){ try { db.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

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

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

  • ベストアンサー
回答No.1

良く理解できていないから見当はずれなことを言っていたらごめんね。 更新前にそのユーザに紐づくデータのtruth_valueを一回0に戻せばいいんじゃないかな? そのあと、今の処理をすればいいと思うんだけど

Marshmallows
質問者

お礼

ユーザに紐づくデータのtruth_valueを一回0に戻すことによって対応できました。ありがとうございました。

関連するQ&A

  • DBのコネクションのclose処理で例外が発生した場合

    DBのコネクションのclose処理で例外が発生した場合 DBアクセスが終わった後、finallyでResultSetやConnection、PreparedStatementのclose処理を行うと思います。 } finally { if (result != null) { try { result.close(); } catch (SQLException e) { } } if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (conn != null) { try { conn.close(); } catch (SQLException e) { } } } 上記では各close処理で例外が発生した場合、何もしていませんがこのあたりの処理は何を行うべきなのでしょうか。 例えばログ出力をして例外をそのまま上位にスローするなどでしょうか。 close処理で例外が発生するのは余程のことだと思うのですが、ログ出力以外で何かやるべき処理はありますでしょうか。

    • ベストアンサー
    • Java
  • 例外処理

    デバッグをしてみました。 すると,try・catch文までしか実行されていないことがわかりました。 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } 例外処理について調べてはみたものの、なぜこの部分で実行が止まってしまうのか、 解決につながるようなことが,みつかりません。 1.例外処理はどのような処理なのか 2.なぜ、try・catchで実行が終了してしまうのか 教えてください。

    • ベストアンサー
    • Java
  • プログラムからの返答の意味がわかりません..

    import java.io.*; public class Teme { public static void main(String [] args) { String [] command = { "C:\\Users\\yuzumodoki\\Desktop\\chunkparser-1.0\\chunkparser-1.0\\parser.exe", "aaaa" }; // 外部プログラムを実行 Runtime runtime = Runtime.getRuntime(); Process process = null; try { process = runtime.exec(command); } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } // 外部プログラムの標準出力から読み込み BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(br); try { String line; while((line = br.readLine()) != null) { System.out.println(line); } } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } finally { try { br.close(); } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } } } } 上記のプログラムはparser.exeにアクセスし,そのアプリケーションに文字列を送り,処理をしてその結果を取得するというものです. 本来"aaaa"と送ると"(aaaa aaaa)"と返ってくるプログラムなのですが, java.io.BufferedReader@89ae9e と返ってきます.これはなぜだかわかる方いらっしゃいますか?また,aaaa aaaaと本来の値を返すにはどうすればいいかわかる方いらっしゃいませんか.. もしわかる方いらっしゃたら教えて頂けたらすごくうれしいです(つj)

  • synchronizedについて

    こんにちは!質問です! javaのsynchronizedについて教えてください。 DBへの更新メソッドに、 排他制御をしようと思っているのですが、調べて自分で コーディングしました。アドバイスをお願いします! public static synchronized void update() throws SQLException{ Connection db = null; PreparedStatement objPs = null; ResultSet rs = null; StringBuffer sql = new StringBuffer(); try { Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("java:/comp/env/test/sample"); db=ds.getConnection(); sql.append("UPDATE "); sql.append("test "); sql.append("SET "); sql.append("aaa = '000', "); sql.append("bbb = '000', "); sql.append("ccc = '000' "); sql.append("WHERE dd = '0'"); objPs=db.prepareStatement(sql.toString()); objPs.executeUpdate(); } catch (SQLException e) { //エラー処理 } catch(Exception e) { //エラー処理 } finally { try { if(rs!=null) {rs.close();} if(objPs!=null){objPs.close();} if(db!=null) {db.close();} } catch(Exception e){ e.printStackTrace(); } } } クラスはpublicですが、static synchronized にしていたら、 排他制御が可能でしょうか? staticなので、インスタンス複数でも1つしか存在しないのですよね? その場合、このメソッドを呼び出しているスレッドが終了しないうちに 別のスレッドが呼び出した場合、そのスレッドはどうなるのでしょうか? 目で見て確認する方法もできれば、教えていただきたいです! また、sql発行メソッド(上記メソッド)を直接排他制御するのと、 上記メソッドの呼出元を排他制御するのと、どちらがいいとかって あるのですか? ご存知の方、よろしくお願い致しますm(_ _)m

    • ベストアンサー
    • Java
  • java servletからMySQLに情報を登録したいのです。

    ホームページのフォームに名前と番号の二つの列があってname[1],bango[1]...のようになっています。 それを番号があるものだけをMySQLに登録したいのですがうまくいきません。 以下に試しに作ったservletを書きます。 import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; public class program2 extends HttpServlet{ private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; //private static final String CONTENT_TYPE = "text/html; charset=EUC_JP"; //private static final String CONTENT_TYPE = "text/html; charset=UTF-8"; private String server; private String db; private String user; private String pass; private String url; private Connection con = null; //グローバル変数の初期化 public void init() throws ServletException{ /*変数の初期化*/ server = "localhost"; //MySQLサーバ名またはIPアドレス db = "database"; //データベース名 user = "root"; //MySQLユーザ名 pass = "data"; //MySQLパスワード /* 必要であればオプションの指定 */ url = "jdbc:mysql://" + server + ":3306/" + db + "?useUnicode=true&characterEncoding=Shift_JIS"; //JDBC URL Shift_JIS /*DB初期処理*/ try{ /* JDBCドライバのロード */ Class.forName("com.mysql.jdbc.Driver").newInstance(); /* MySQLサーバ接続 */ con = DriverManager.getConnection(url, user, pass); } catch (SQLException e){ e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } /*HTTP Get リクエストの処理*/ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //エンコード request.setCharacterEncoding("Shift_JIS"); //FORMからの第一次受け渡し String name = "naoki"; String jikoku = "1200"; //for文の始まり for(int i = 1; name != null; i++){ //if文の始まり if(jikoku != null){ //FORMからの第一次受け渡し name = request.getParameter("name["+ i +"]"); jikoku = request.getParameter("jikoku["+ i +"]"); response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); Statement stmt = null; ResultSet rs = null; try{ /* 検索するSQL文を作成 */ String sql = "INSERT INTO table1 (eki,jikoku) VALUES ('"+name+"','"+jikoku+"') "; /* Statementオブジェクトの生成とクエリの実行 */ stmt = con.createStatement(); stmt.executeUpdate(sql); /* 切断 */ stmt.close(); } catch (SQLException e){ out.println("<h3>登録に失敗しました</h3>"); e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } finally{ /* finallyを使って資源の解放 */ try{ if (stmt != null){ stmt.close(); stmt = null; } } catch (Exception e){ e.printStackTrace(); } } }//if文の終了 }//for文終了 } /*サーブレットインスタンスが破棄されるときに、サーブレットコンテナに最後に1度呼び出される*/ public void destroy(){ /* 切断 */ try{ if (con != null){ con.close(); con = null; } } catch (Exception e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • javaサーブレットからのoracle接続エラー

    お世話になります。 javaサーブレットからoracleに接続する際、以下のエラーが発生して困っております。 エラー:java.sql.SQLRecoverableException: クローズされた接続です。 解決するための情報を頂けますでしょうか。 私がテストしている環境は、以下となります。 【Webサーバ】 centOS5.5. jdk1.6 tomcat5.5 【DBサーバ】 centOS5.5. oracle10g r2 jdbcドライバーは、ojdbc6.jarを使用しております。 サーブレット起動時にDB接続し処理完了時にDBクローズしていますが、DBクローズ処理にて 上記エラーが、発生してしまいます。 DB接続及びDBクローズは、以下のようにプログラミングしております。 /** * 概要 : DBアクセス * 処理 : DBアクセス */ public void dbAccess() throws Exception { conn = null; try { DriverManager.setLogWriter(new PrintWriter(System.out)); Class.forName(driver); conn = DriverManager.getConnection( jdbcPrefix + hotname + dbname, username,password); // 自動コミット・モードを設定(手動コミット) conn.setAutoCommit(false); }catch (SQLException e) { throw e; }catch (Exception e) { throw e; } } /** * 概要 : DBクローズ * 処理 : DBを閉じます。 */ public void dbClose() throws Exception { try { if (conn != null) conn.close(); }catch (Exception e) { throw e; } } お手数お掛け致しますが、ご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • Oracleに接続すると、それ以降の処理を素通りしてしまう

    下記のようなメソッドで<1><2>の後、すぐに<7>に処理をしてしまいます。 <1>~<7>と動くと思っていたのですが、<3>~<6>が全て無視されます。 どこか問題があるのでしょうか? ちなみに、<1>で無効なURLを指定するとSQLExceptionでcatchされます。 try { Class.forName("oracle.jdbc.OracleDriver"); try { //<1> conn = DriverManager.getConnection (URL, UID, PSW); //<3> System.out.println("Oracleと接続しました"); } catch (SQLException e) { System.out.println("oracle接続エラー"); } catch (Exception e) { System.out.println("oracle接続エラー"); } //<4> try { //<5> stmt = conn.createStatement(); //<6>sql文の作成 // select文の実行 //(略) } catch (Exception ex3) { System.out.println("なんかエラーです"); } } catch (Exception e){ System.out.println("その他エラーです"); //<2> } finally { //特になし } //<7> return list;

    • ベストアンサー
    • Java
  • forward()でエラーが出て対応ができません。

    どなたか、教えてください。 サーブレットからDBに接続して、検索条件(名前)が一致しているレコードを取得。 request.setAttribute リクエストデータにその人の住所をセットし、別のjspファイルに送り 表示するプログラムなんですが。 getServletConfig().getServletContext().getRequestDispatcher("/jsp/result1.jsp").forward(request, response);の部分で、コミット済みというエラーが発生します。 下記がそのプログラムです。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws     ServletException, IOException {      request.setCharacterEncoding("windows-31J");      String name = request.getParameter("name1");      Connection con=null;;      PreparedStatement ps =null;  try{       Context context = new InitialContext();     DataSource ds =(DataSource)context.lookup("java:comp/env/jdbc/FrameWork");     con = ds.getConnection();     ps = con.prepareStatement("SELECT * FROM address where name like ?;");     ps.setString(1, name);     ResultSet rs = ps.executeQuery();    rs.next();    String address =rs.getString("address");   request.setAttribute("address1", address);    rs.close();    ps.close(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ con.close();             }catch(SQLException e){e.printStackTrace();} }     try{ getServletConfig().getServletContext().getRequestDispatcher ( "/jsp/result1.jsp").forward(request, response);       }catch(Exception e){System.out.print(e);} } } エラーにも関わらず、ページは切り替わるのですが、アドレスはNULL値が表示されます。 一応、デバックをしてSQLの取得、リクエストデータのセットまでは、問題ないのは確認済みです。 乱文でわかりづらいのですが、どなたかお願いいたします。

  • JavaからMDB接続について

    下記PGについて ------------------------------------ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ClassDatabase { public static Connection connection; public static Statement statement; public static ResultSet resultSet; public void main(String DBNM) { try { // Load the UCanAccess JDBC driver Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); // Define the database URL String url = "jdbc:ucanaccess://" + DBNM + ";"; // Establish the connection DB_CONNECT(url); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void DB_CONNECT(String url) { try { connection = DriverManager.getConnection(url); } catch (SQLException e) { e.printStackTrace(); } finally { // Close the connection when you're done if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } ------------------------------------ connection = DriverManager.getConnection(url);の所ですが応答が帰って来ないほど遅いのですがどうにかなりますでしょうか? MDBと接続はできています。(整合性チェック等を行っているようです、させない方法等ありますでしょうか?)

    • ベストアンサー
    • Java
  • UPDATE文について

    JAVA言語のStatmentクラスのexcecuteUpdateメソッドを使い、DB2のUPDATE文を操作した場合、 「対象となる行がないか、または照会の結果が空の表です。」となったとき、SQLExceptionのようExceptionをキャッチすることは可能でしょうか。 またあったら教えてください。 よろしくお願いします。

専門家に質問してみよう