0

私のアプリケーションでは、日付値(文字列として)をパラメーターとしてサーブレットに渡しました。サーブレットコードでは、文字列を「2013-02-05」(yyyy-MM-dd)としてSQL日付に変換しました。

例:dat=" 05/02/2013"はsqlDate="2013-02-05"に変換されます。私のサーブレットコードは

 dat= request.getParameter("dat");
 //dat="05/02/2013";
     try
     {
         java.util.Date date=new SimpleDateFormat("dd/MM/yy").parse(dat);
         //out.println(date);
         sqlDate = new java.sql.Date(date.getTime());
         //out.println(sqlDate);
     }
     catch(Exception e)
     {

     }

if(div_code!=null)
{
try
{

 Class.forName("oracle.jdbc.driver.OracleDriver");
 java.sql.Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@xxx.xxx.x.xxx:xxx:pdsm", "test", "test");
 Statement stmt=conn.createStatement();
     ResultSet rs=stmt.executeQuery("insert into offer1 values('"+r_code+"','"+v_name+"','"+vcode+"','"+div_code+"','"+sec_code+"','"+extent+"','"+phone+"','"+sqlDate+"','"+loan+"','"+seeds+"','"+offerno+"','"+loc+"')");
      conn.setAutoCommit(true);
      out.println("data inserted");

   }catch(Exception e)
    {
       out.println(e);
    }
 }

これをAndroidアプリケーションから呼び出すと、「ORA-01861:リテラルがフォーマット文字列と一致しません」というエラーが表示されます。私が使用したフォーマットは、サンプル入力でテストしたときに正しい結果を示しています。しかし、データは挿入されませんでした。

私のコードの問題は何ですか?なぜこのエラーが発生するのですか?さらに変換する必要がありますか?はいの場合、どのように?

また、サーブレットでpl / sql関数(to_date())を使用できると誰かが説明していますか?日付を変換しやすいので

編集:変更されたコード:

String query="insert into offer1('RCODE','OFFERNO','DAT') values(?,?,?)"; 
PreparedStatement ps=conn.prepareStatement(query);
ps.setString(1,r_code);
ps.setString(2,offerno);
ps.setDate(3,sqlDate);
ResultSet rs=ps.executeQuery();
out.println("data inserted");
4

3 に答える 3

1

まず第一に、このようにクエリを組み立てないでください(すべてを単一の文字列に追加します)。

SQLインジェクションに対して脆弱です。SQLインジェクションを参照してください

PreparedStatementSQLインジェクションから保護し、さまざまな値の変換タスクが自動的に処理されるため、より適切に使用できます。

したがって、java.sql.Date変数がsqlDateあり、それをデータベースに挿入する場合は、次の簡単な手順が必要です。

String query = "insert into your_table_name(`name`,`myDate`) values(?,?)";
PreparedStatement ps = conn.prepareStatement(query);
//now just set the values like this
ps.setString(1,"ABC");
//note index starts at 1
ps.setDate(2,sqlDate);
ResultSet rs = ps.executeQuery();

今、あなたがあなた自身のためにそれをする方法を理解できることを願っています。

詳細については、これこれを参照してください

于 2013-02-06T05:03:19.607 に答える
0
//String date = "05/02/2013";
dat= request.getParameter("dat");
SimpleDateFormat dateFormater = new SimpleDateFormat("dd/MM/yyyy");
Date testDate = null;
try {
    testDate = dateFormater.parse(dat);
}catch(Exception ex){
    ex.printStackTrace();
}

「dd/MM/yyyy」から「yyyy/MM/dd」へ

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
String convertedDate = formatter.format(testDate);
System.out.println("Your converted Date :- "+convertedDate);
于 2013-02-06T04:59:40.093 に答える
0

私はあなたのコードにいくつかの問題を見ることができます

1)Class.forName( "oracle.jdbc.driver.OracleDriver")を削除します。DriverManagerは、クラスパスで必要なドライバを見つける方法を知っています。

2)conn.prepareStatementを使用します。APIを参照してください

3)conn.setAutoCommit(true);を削除します。connはデフォルトで自動コミットモードです

4)stmt.executeQueryの代わりにstmt.executeUpdateを使用します

于 2013-02-06T05:03:00.457 に答える