相同的 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 中不显示