java - ORA-01861 : literal doesn't match format string

标签 java sql date jdbc

在我的应用程序中,我将日期值(作为字符串)作为参数传递给 Servlet。在 Servlet 代码中,我将字符串转换为 SQL 日期,即“2013-02-05”(yyyy-MM-dd)。

示例:dat="05/02/2013" 转换为 sqlDate="2013-02-05"。 我的servlet代码是

 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:文字与格式字符串不匹配”。当我使用示例输入进行测试时,我使用的格式显示了正确的结果。但数据没有插入。

我的代码有什么问题?为什么我会收到此错误?我需要进一步转换吗?如果是,那么如何?

另外,有人解释一下我可以在 servlet 中使用 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");

最佳答案

首先,不要像这样构建查询(将所有内容附加到单个字符串中)。

它容易受到 SQL 注入(inject)的攻击,请参阅 SQL injection

因此最好使用 PreparedStatement,因为它可以保护您免受 SQL 注入(inject),并且会自动处理各种值的转换任务。

因此,如果您有一个 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();

现在希望您能弄清楚如何自己做到这一点。

有关更多信息,请参阅 thisthis

关于java - ORA-01861 : literal doesn't match format string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721810/

相关文章:

java - 如何从 Hibernate Search 获取最低和最高价格

java - 方向改变后 fragment 变成幽灵

sql - Postgres : filtering results using ARRAY_AGG and HAVING (instead of WHERE)

ios - 将字符串转换为 NSDate 给出错误的日期

java - 获取一周的开始日和结束日? [Java]

java - @JoinTable是否有属性 "table"?

java - 使用外部电子邮件应用程序通过电子邮件发送文本输入 android

MySQL:如果某些记录包含特定单词,如何对结果进行排序

sql - 参数只能与其他参数一起工作,但我希望它们独立工作

Ruby:将十进制的日期转换为名称的日期