CREATE TABLE语句在executeBatch下静默失败

时间:2016-01-24 06:29:12

标签: java ms-access jdbc ucanaccess

这是我的代码部分。在我执行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();

3 个答案:

答案 0 :(得分:1)

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

另外,因为VARCHAR列宽度超过255个字符,所以CREATE TABLE语句实际上会创建一个带有" Memo" (a.k.a." Long Text")字段作为主键。在Access UI中不允许创建这样的表,因此应该考虑"不推荐"。相反,使用类似的东西来创建一个带有AutoNumber主键的表:

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

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

答案 1 :(得分:0)

首先,使用false方法

设置自动提交为setAutoCommit()
 con.setAutoCommit(false);

最后,使用commit()方法

提交连接
 con.commit();

代码:

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

答案 2 :(得分:0)

您的表未创建,因为您将主键设置为varchar(1000),其中,主键的最大长度为767字节。所以你必须将密钥的长度减少到767,这取决于你的表格编码。设置varchar(767)并不意味着767字节,您可以搜索“varchar中主键的长度”,如果您不需要这1000长度,则可以更改为varchar(250)

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

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