首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ORA-01861:文字不匹配格式字符串

ORA-01861:文字不匹配格式字符串
EN

Stack Overflow用户
提问于 2013-02-06 04:51:44
回答 3查看 2K关注 0票数 0

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

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

代码语言:javascript
运行
复制
 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: this不匹配格式字符串“。在用样例输入进行测试时,我使用的格式显示了正确的结果。但是数据没有被插入。

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

另外,有人解释我可以在servlet中使用pl/sql函数(to_date())吗?因为转换日期很容易

编辑:修改代码:

代码语言:javascript
运行
复制
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");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-06 05:03:19

首先,不要像这样设置查询框架(将所有内容都附加到单个字符串中)。

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

因此,更好地使用PreparedStatement,因为它将保护您免受SQL注入的影响,并且将自动处理各种值的转换任务。

因此,如果您有一个java.sql.Date变量sqlDate,现在要将它插入数据库中:那么您需要以下简单步骤:

代码语言:javascript
运行
复制
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();

现在希望你能想出如何为自己做这件事。

有关更多信息,请参见

票数 1
EN

Stack Overflow用户

发布于 2013-02-06 04:59:40

代码语言:javascript
运行
复制
//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”

代码语言:javascript
运行
复制
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
String convertedDate = formatter.format(testDate);
System.out.println("Your converted Date :- "+convertedDate);
票数 0
EN

Stack Overflow用户

发布于 2013-02-06 05:03:00

我可以在您的代码中看到几个问题

1) remove Class.forName("oracle.jdbc.driver.OracleDriver"),DriverManager知道如何在类路径上找到必需的驱动程序

2)使用conn.prepareStatement,请参阅API

3)删除conn.setAutoCommit(true);康涅狄格默认处于自动提交模式

4)使用stmt.executeUpdate而不是stmt.executeQuery

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14721810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档