• 締切済み

PreparedStatementを使用したDBへの書き込み

検索させていただいたのですが、同じ事例が見当たらなかったので、質問させてください。 タイトルのようにPreparedStatementを使用してDBへ書き込みたいのです。 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; import java.sql.ResultSet; import java.sql.DriverManager; import java.util.Vector; import java.util.Hashtable; import java.util.Date; import java.util.Iterator; ~略~ Date date = new Date(); insert.setString(1,loginid); insert.setInt(2,cart.getGoodsid()); insert.setInt(3,cart.getOrdernum()); insert.setDate(4,date); ※ insert.executeUpdate(); ~略~ というような感じで行いたいのですが、 ※部分でコンパイルエラーになってしまいます。 (この場合はシンボルを解決できませんとなります) 上記以外にもいろいろ試してみましたが、 どうしてもわかりません。 回答よろしくお願いします。

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

みんなの回答

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.1

エラーが出た場合はエラーメッセージをそのままのせてください。そのほうがピンポイントでアドバイスを得られると思います。 いまJavaAPIをみたのですが public void setDate(int parameterIndex, java.sql.Date x) となっていました。 ソースではjava.util.Dateを使っているようです。 その変がコンパイルエラーになっているのでは?

coroco
質問者

お礼

回答ありがとうございます。 chi-konのおっしゃるようにimport java.sql.Dateにしたら、その部分のエラーが消えました。 日付を登録したいのですが、また別のエラーが発生しました。 もうちょっと考えて見ます。 ありがとうございました。

関連するQ&A

  • DBにかな情報が登録できません(JSP)

    <%@ page contentType="text/html; charset=SHIFT_JIS" import="java.sql.*,javax.naming.*,javax.sql.*,java.util.*" %> <%@ page import = "java.util.Date" %> <%@ page import = "java.text.DateFormat" %> <%@ page import = "java.text.SimpleDateFormat" %> <%@page import="java.text.NumberFormat" %> <% request.setCharacterEncoding("SHIFT_JIS"); %> <% Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/workshop"); Connection db=ds.getConnection(); String name = request.getParameter("Name"); String busyo = request.getParameter("Shozoku"); PreparedStatement prdStt3=db.prepareStatement("INSERT INTO Rireki (Name,Busyo) VALUES(?,?)"); prdStt3.setString(1,name); prdStt3.setString(2,busyo);; prdStt3.executeUpdate(); out.println("名前:" + name + "<BR>"); out.println("所属部署:" + busyo + "<BR>"); prdStt3.close(); db.close(); %> ========================== 【環境】 Webサーバ:Tomcat5.5,apache2.0.49 DB:MySQL4.1 JAVA:JDK1.5.0.7 ========================== 上記ソースでDBに情報を書き込もうとしましたが、うまくいきません。 半角英数字は登録できますが、かなは全角・半角ともに登録されていないようです。 パラメータに値そのものは入っているらしく、printlnで出力したところ、画面上で入力情報を確認出来ました。 どなたかお気づきの点がありましたら是非ともアドバイス下さい。 お願いいたします。

    • ベストアンサー
    • Java
  • javaの掲示板について

    投稿日時の取得部分の抜粋なのですが、全てのnew SimpleDateFormatの部分でシンボルが見つからないと言われます。 調べて出てくるところと同じに書いているので、エラーが出てくる原因がわかりません。 変更したり、付け加える点を教えてください。 よろしくお願いします。 import java.sql.*; import java.sql.Timestamp.*; import java.io.*; import java.util.Date.*; import java.text.DateFormat.*; import java.text.SimpleDateFormat.*; import java.util.Vector; public class MessageDao { private static final String DATE_PATTERN = "yyyy.MM.dd HH:mm:ss"; private String date2string(Timestamp timestamp){ SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); return sdf.format(timestamp); } 投稿メッセージの一覧を取得します public Vector getMessageList() throws Exception { Vector messageList = new Vector(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = this.getConnection(); String sql = "SELECT * FROM MESSAGE_TABLE ORDER BY ID DESC"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); while(rs.next()) { Message message = new Message(); Timestamp timestamp = rs.getTimestamp("DATE"); String strDate = new SimpleDateFormat(DATE_PATTERN).format(timestamp); message.setDate(strDate);

    • ベストアンサー
    • Java
  • oracle10g java jdbc 大量insertの高速化

    oracle10g java jdbc 大量insertの高速化 以下のプログラムで1万件処理したところ30秒ぐらいかかりました。 まだ高速化の余地があると思うのですが、何かいい方法はありませんでしょうか? String sql = "INSERT INTO TEST3 VALUES(?,?)"; PreparedStatement ps = con.prepareStatement(sql); while(rs5.next()){ int id = rs5.getInt(1); String line = rs5.getString(2); ps.setInt(1,id); ps.setString(2,line); ps.addBatch(); } ps.executeBatch();

    • ベストアンサー
    • Java
  • お世話になっています。

    お世話になっています。 JAVAの勉強中です。サンプルを作って動作確認しています。 下記のようなテーブルに、データをINSERTしたいのですが、dateの部分がうまくいきません。 【testテーブル】 =============== フィールド 型 text    text date    date ID     serial NOT NULL 今は下記のようなソースでtext部分のみ格納できることを確認しています。 【ソース(一部抜粋】 String sampleText; sampleText = "てすと";  …省略… Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url,"postgres","postgres"); String sql = "insert into test values (?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,sampleText); int num = pstmt.executeUpdate(); pstmt.close();  …省略… String型でinsertしようとすると、エラーが起こって実行できませんでした。 date型を宣言して使用しようとおもったのですが、うまくいきません… 変数を作って使用したいのですが、どのように実装すればいいのでしょうか? どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • JDBCのDB検索

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; public class AddressDB { private static enum Procnumlist { NAME("名前"), FNAME("フルネーム"), END("終了"); private String name; private Procnumlist(String name) { } } //上の列挙型を基にした処理判定用マップを作成 private static final Map<Integer, Procnumlist> procmap; static { procmap = new HashMap<Integer, Procnumlist>(); procmap.put(1,Procnumlist.NAME); procmap.put(2,Procnumlist.FNAME); procmap.put(6,Procnumlist.END); } //結果 //ResultSetは受け取らない private static void ans(List<Addr> ans) { try { System.out.println("検索結果"); for (int i = 0; i < ans.size(); i++) { Addr addr = ans.get(i); System.out.println(addr.getName() + ":" ); } } catch (SQLException e) { e.printStackTrace(); } finally { //閉じる。 close(); } } //名前検索(フルネーム) private static List<Addr> srchFName(String keyword,Connection con) throws IOException { String sql = "SELECT * FROM data2 where name=?"; PreparedStatement ps = null; try{ ps = (PreparedStatement) con.prepareStatement(sql); ps.setString(1,keyword); ResultSet rs = ps.executeQuery(); //List<Addr> result = new ArrayList(Addr); while(rs.next()){ rs.getString("name"); } }catch (SQLException ex) { } return null; } //名前検索 private static List<Addr> srchName(String keyword,Connection con) throws IOException { String sql = "SELECT * FROM data2 where name like ?"; PreparedStatement ps = null; try{ ps = (PreparedStatement) con.prepareStatement(sql); ps.setString(1,"%"+keyword+"%"); ResultSet rs = ps.executeQuery(); while(rs.next()){ Addr addr = rs.getString("name"); } }catch (SQLException ex) { } return result; } private static boolean checkProcNum(int value) { return procmap.get(value) != null; } public static void main(String[] args)throws IOException{ while(true) { createConeection(); //処理条件入力 System.out.println("検索\n1.名前(ファーストネーム)で検索\n2.フルネームで検索\n6.終了"); //検索値入力 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int procnum = Integer.valueOf(br.readLine()); //入力チェック if (!checkProcNum(procnum)) { System.out.println("正しい値を入れてください。"); continue; } Procnumlist proc = procmap.get(procnum); if (proc == Procnumlist.END) { break; } if(proc == Procnumlist.NAME){ System.out.println("名前を入力してください。"); BufferedReader name = new BufferedReader(new InputStreamReader(System.in)); String keyword = name.readLine(); List<Addr> result = srchName(keyword,null); ans(result); } if(proc == Procnumlist.FNAME){ System.out.println("フルネームを入力してください。"); BufferedReader name = new BufferedReader(new InputStreamReader(System.in)); String keyword = name.readLine(); List<Addr> result = srchFName(keyword,null); ans(result); } } } //コネクション private static Connection createConeection() { String url = "jdbc:mysql://localhost/address"; String user = "test"; String password = "pass"; try { return DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); return null; } } } 現在JDBCでDB接続し入力された値をDBから検索し出力するものを作成しておりますが詰んでしまいました。 入力した値をsrchで検索し結果をansで出力しようとしています。どのようにしたらよいのでしょうか

  • 「?」→「setString」が使えません

    PreparedStatementオブジェクトを利用してSQL(INSERT)を実行します。 開発は次の環境で行いました。 OS:Windows2000(SP4) Java:1.4.2_03 Eclipse:2.1.2 PostgreSQL:8.0 パラメータは「?」を利用し、 ArrayListに収容された値を順にsetStringしていきます。 この環境では問題なく処理は終了しました。 SQL実行直前にPreparedStatementオブジェクトを標準出力させたところ、 各カラム値には自動的に「'」が付与され、 カラム値に「'」が含まれる場合には その前に「\」も付加されていました。 ところがこの同じプログラムをMacに移植すると異常終了します。 環境は、 OS:Mac OS X Server 10.4 Java:1.4.2_07 Eclipse:3.0.2 PostgreSQL:8.0 です。 PreparedStatementオブジェクトを標準出力させたところ 「?」の位置にセットされた各パラメータは 「'」で括られていませんでした。 【例】 ■ Windows INSERT INTO Public.TEST VALUES ( '7033347960','2005-03-31','AAAA\'S', ・・・続く ■ Mac INSERT INTO Public.TEST VALUES ( 7033347960,2005-03-31,AAAA'S, ・・・続く 「'」の前にエスケープ文字もありません。 環境として、Javaのバージョンも書きましたが Eclipse上で実行していますので、もしかしたら別のVMを使っているのかも知れない、 と感じています。 しかし同じJavaで同じPGMを実行しても このままでは今のMac環境で「?」→「setString」が使えません。 何が影響しているのか、どうすればよいのか、 どなたかお教えいただけませんでしょうか?

    • ベストアンサー
    • Java
  • eclipseに記述したjavaファイルに黄色の波線

    が現れるのですが これは問題ないのでしょうか? たとえば import javax.servlet import javax.servlet.http import java.io import java.util import java.util.zip import java.sql.*; import oracle.jdbc.driver.*; の java.util.*; java.util.zip.*; java.sql.*; oracle.jdbc.driver.*; の下に黄色の波線が出てしまいます。 これを消すにはどうしたらいいのでしょうか?

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

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; public class DBtest { public static void main(String[] args){ try { Connection con = null; PreparedStatement ps = null; String url = "jdbc:mysql://localhost/address"; String user = "test"; String password = "pass"; con = DriverManager.getConnection(url, user, password); Statement st = (Statement) con.createStatement(); Statement st2 = (Statement) con.createStatement(); String sql = "SELECT * FROM data2"; ResultSet rs = st2.executeQuery(sql); try { System.out.println("ok"); // ここでクエリを実行 while(rs.next()){ System.out.println(rs.getString("name")+rs.getString("age")); } //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader na = new BufferedReader(new InputStreamReader(System.in)); String Na = na.readLine(); String ins = "INSERT INTO data2(name,age)VALUES('?',20)"; ps = (PreparedStatement) con.prepareStatement(ins); ps.setString(1,Na); ps.executeUpdate(); //INSERT実行 int rs2 = st2.executeUpdate(ins); System.out.println(rs2); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } finally { // 直前の try ブロックに入ったら、ここは必ず実行される con.close(); } } catch (SQLException ex) { System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); // 接続できない時 } } } 現在javaでmysqlに接続してDB内の検索や追加等を行うものを作成しています。 現状は入力されたものをDBに追加することまでできましたが 検索で 入力された値がDBの中に一致する、または部分一致したものを表示させるやり方がわかりません

    • ベストアンサー
    • Java
  • java プログラミング 型変換 データベース

    型変換について質問です。下のプログラムは 「Double str2 = (Double)iter3.next();」 の行で java.lang.ClassCastException: [I at kadai6_a.main(kadai6_a.java:152) というエラーがでます。なんでかわからなくて教えてください! ちなみに上のStringへの型変換ではエラーはでないんです。。 (前略) PreparedStatement stmt2 = db.prepareStatement( "INSERT INTO doc(docid, docname,length) VALUES(?, ?, ?);"); docID = 0; Iterator iter2 =docNames.iterator(); List l = java.util.Arrays.asList(str); Iterator iter3 = l.iterator(); while(iter2.hasNext()){ while(iter3.hasNext()){ String docName = (String)iter2.next(); Double str2 = (Double)iter3.next(); stmt2.setInt(1, docID); stmt2.setString(2, docName); stmt2.setDouble(3,str2); stmt2.executeUpdate(); //System.out.println("docID="+docID); docID++; } } stmt2.close(); } catch (Exception e) { e.printStackTrace(); } (後略) ではお願いします!

    • ベストアンサー
    • Java
  • PreparedStatementでの複数検索

    PreparedStatementでの複数検索 環境:struts1.3,postgresql8.4,JDK1.6 テキストボックスなどから1つから6つの条件でsqlを検索したいのですが この場合、1つでもnullがある時は検索されません。 Connection con = null; con = ProductDAO.getConnection(); //SQLの実行 String selectStatement = "SELECT * FROM test,test_list WHERE test.id = test_list.id " + "AND prefecture=? " + "AND low_price>=? " + "AND low_age>=? " + "AND sameday_select =? " + "AND terms_select =?" + "AND category=?"; PreparedStatement prepStmt = con.prepareStatement(selectStatement); prepStmt.setString(1, aForm.getPrefecture()); prepStmt.setInt(2, aForm.getLow_price()); prepStmt.setInt(3, aForm.getLow_age()); prepStmt.setString(4, aForm.getSameday_select()); prepStmt.setString(5, aForm.getTerms_select()); prepStmt.setString(6, aForm.getCategory()); ResultSet rs = prepStmt.executeQuery(); (3) SQLの実行結果の処理 while (rs.next()) {   処理 } この場合、if文などでaForm.getPrefecture()がnullの場合などで1つ1つ条件を付けないと駄目でしょうか?その場合、if文が膨大な数になってしまうため何か良い方法はありますか。 あるならば、具体的に教えて下さい。

専門家に質問してみよう