CREATE TABLE 语句在 executeBatch 下静默失败

Posted

技术标签:

【中文标题】CREATE TABLE 语句在 executeBatch 下静默失败【英文标题】:CREATE TABLE statements silently failing under executeBatch 【发布时间】:2016-01-24 06:29:11 【问题描述】:

这是我的部分代码。在这种情况下,当我执行 sql 语句时,create table 没有在数据库中创建任何表,也没有抛出任何错误。这是为什么呢?

我正在使用带有 MS-Access 的 JDK SE 8 的 NetBeans。

String sql1="Insert into Signup_Login (UserName,DOB,EmailId,Password) values ('"+name.getText()+"','"+dob.getText()+"','"+emailId.getText()+"','"+pass.getText()+"')";
String sql2="create table "+emailId.getText()+"Inbox(InMsgs varchar(1000), primary key(InMsgs))";
String sql3="create table "+emailId.getText()+"Outbox(OutMsgs varchar(1000), primary key(OutMsgs))";

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
con=DriverManager.getConnection("jdbc:ucanaccess://C:/Users/LENOVO/Documents/Email.accdb");
st=con.createStatement();
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
st.executeBatch();

【问题讨论】:

设置自动提交为false @Ticktick 是什么错误? @MangeshGhotage 没有错误 您应该将Statement.execute() 用于DDL 语句,例如CREATE TABLE 【参考方案1】:

使用 UCanAccess 3.0.3.1 我能够重现您尝试使用 addBatch()/executeBatch() 运行 CREATE TABLE 语句的问题。但是,如果每个都使用 executeUpdate() 独立运行,它们似乎可以正常工作。

此外,由于 VARCHAR 列的宽度超过 255 个字符,因此您的 CREATE TABLE 语句实际上会创建以“Memo”(也称为“Long Text”)字段作为主键的表。 Access UI 中不允许创建这样的表,因此可能应被视为“不推荐”。相反,使用这样的东西来创建一个带有自动编号主键的表:

String sql2="CREATE TABLE ["+emailId.getText()+"Inbox] (id COUNTER PRIMARY KEY, InMsgs MEMO)";

(...暂时忽略为每个 emailId 创建单独的相同表这一事实几乎可以肯定是个坏主意。)

【讨论】:

【参考方案2】:

首先,使用setAutoCommit()方法设置自动提交为false

 con.setAutoCommit(false);

最后,使用commit()方法提交连接

 con.commit();

代码:

st=con.createStatement();
con.setAutoCommit(false);
st.addBatch(sql1);
.................
st.executeBatch();
con.commit();

【讨论】:

没有错误。但是当我打开数据库时,我找不到那些表 这应该可以。提交完成后是否刷新了数据库?表格不会只是添加到 UI 中。您将需要刷新。 是的,我确实刷新了它。 @P.Jairaj【参考方案3】:

您的表没有被创建,因为您将主键设置为varchar(1000),其中,主键的最大长度为 767 字节。因此您必须将密钥的长度减少为 767,这取决于您的表编码。设置varchar(767)不代表767字节,可以搜索“varchar中主键的长度”,如果不需要这1000的长度可以改成varchar(250)

如果您在文本中收到电子邮件地址,则应将表名放在 (`) 之间,如下所示:

String sql2="create table `"+emailId.getText()+"Inbox` 
(InMsgs varchar(1000), primary key(InMsgs))";

【讨论】:

我把它减到了 10。没用 emailId.getText() 的值是多少? 是我在JTextField emailId中输入的字符串。 好的,如果您在文本字段中输入完整的电子邮件,您应该更新您的查询以将您的表名放在(`)之间 现在它抛出一个错误,说明意外令牌 emmaInbox

以上是关于CREATE TABLE 语句在 executeBatch 下静默失败的主要内容,如果未能解决你的问题,请参考以下文章

CREATE TABLE 语句中的语法错误

在 create table 语句中内联创建外键索引的语法

是否可以在 db2 中的 create table 语句本身中定义索引?

CREATE TABLE 语句中的“pool_name”是啥意思?

oracle中,用create table ... as select * from table_a...语句备份或者其他用途会不会产生归档日志,

使用show create table导出创建表语句的问题