相同的 SQl 查询在访问中运行,但在使用 java 的访问中的 sql 脚本中失败

Posted

技术标签:

【中文标题】相同的 SQl 查询在访问中运行,但在使用 java 的访问中的 sql 脚本中失败【英文标题】:Same SQl query runs in access but failed in sql script in access using java 【发布时间】:2014-11-01 06:52:11 【问题描述】:

当我在数据库中运行查询时,以下查询有效

 INSERT INTO `M_DT_SaveAndClose` (`StoryName`, `Assignee`, `Createddate`, `CreatedBy`)
 VALUES (' DT_0019_BGL_2014_11_01_AM_01_MN_01_11_2014_12_07_06_281_000772.xml ',
 ' T0003SathyabamaT ', ' 2014-11-01 12:08:22  ', ' Admin  ')

但是当我使用java通过sql脚本运行相同的查询时,它会抛出错误

"Error executing: INSERT INTO `M_DT_SaveAndClose` (`StoryName`, `Assignee`, `Createddate`, `CreatedBy`) 
   VALUES (' DT_0019_BGL_2014_11_01_AM_01_MN_01_11_2014_12_07_06_281_000772.xml ',
   ' T0003SathyabamaT ', ' 2014-11-01 12:08:22  ', ' Admin  ').
 Cause: net.ucanaccess.jdbc.UcanaccessSQLException: data exception: invalid datetime format"

java中的查询生成步骤:

   savequery = "INSERT INTO `M_DT_SaveAndClose` (`StoryName`, `Assignee`, `Createddate`, `CreatedBy`) VALUES (' " + storyidgen.concat(".xml").trim() + " ', ' " + usernames.trim() + " ', ' " + dateFormat.format(date).trim() + "  ', ' Admin  ');";

访问表结构:

   CREATE TABLE M_DT_SaveAndClose (\n"
            + "  slno Integer,\n"
            + "  StoryName VARCHAR,\n"
            + "  Assignee VARCHAR,\n"
            + "  [Createddate] DateTime,\n"
            + "  CreatedBy VARCHAR,\n"
            + "  [createdtime] DateTime\n"
            + ")

我正在使用 ucanaccess-2.0.6.2.jar。提出一些想法。

【问题讨论】:

为什么在插入前不修剪'2014-11-01 12:08:22'?你有没有尝试修剪这个然后运行查询? 【参考方案1】:

我在您的查询中看到很多看起来可疑的空白。我建议你删除它,

INSERT INTO `M_DT_SaveAndClose` 
    (`StoryName`, `Assignee`, `Createddate`, `CreatedBy`)
VALUES 
    ('DT_0019_BGL_2014_11_01_AM_01_MN_01_11_2014_12_07_06_281_000772.xml',
     'T0003SathyabamaT', '2014-11-01 12:08:22', 'Admin')

【讨论】:

在查询生成期间没有使用修剪 @Dhinakar 不符合您的例外情况(或您发布的查询)。【参考方案2】:

确实,是 [Createddate] 的字符串文字中的前导和尾随空格弄乱了您。简单地改变

... + " ', ' " + dateFormat.format(date).trim() + " ', ' Admin ' ...

... + " ', '" + dateFormat.format(date).trim() + "', ' Admin ' ...

使错误消失。但是,如果您使用这样的参数化查询,您的代码会更简洁、更易于维护、并且更安全

String savequery = 
        "INSERT INTO M_DT_SaveAndClose (StoryName, Assignee, Createddate, CreatedBy) " +
        "VALUES (?,?,?,?)"; 
try (PreparedStatement ps = conn.prepareStatement(savequery)) 
    ps.setString(1, storyidgen.concat(".xml").trim());
    ps.setString(2, usernames.trim());
    ps.setTimestamp(3, new Timestamp(date.getTime()));
    ps.setString(4, "Admin");
    ps.executeUpdate();

【讨论】:

以上是关于相同的 SQl 查询在访问中运行,但在使用 java 的访问中的 sql 脚本中失败的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL Developer 中运行的日期查询显示时间,但在 Oracle SQL Developer 中不显示

SQL 查询在通过 phpmyadmin 进行测试时工作正常,但在 PHP PDO 中尝试相同的事情时失败

执行查询并在数据网格框中填充相同的内容

PDO - 对多个 foreach 循环使用相同的查询

在 SQL 中有效但在 PHP 中无效的查询

直接和通过 VBA excel 运行相同的存储 Access SQL 查询时获得不同的结果