CREATE TABLE 语句在 executeBatch 下静默失败
CREATE TABLE statements silently failing under executeBatch
这是我的部分代码。在此,当我执行 sql 语句时,create table 不会在数据库中创建任何 table,也不会抛出任何错误。这是为什么?
我在 JDK SE 8 和 MS-Access 中使用 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
使用 setAutoCommit()
方法
con.setAutoCommit(false);
最后,使用commit()
方法提交连接
con.commit();
代码:
st=con.createStatement();
con.setAutoCommit(false);
st.addBatch(sql1);
.................
st.executeBatch();
con.commit();
您的 table 未创建,因为您将主键设置为 varchar(1000)
,其中,主键的最大长度为 767 字节。因此您必须将密钥的长度减少到 767,这取决于您的 table 编码。设置varchar(767)不是说767字节,可以搜索"the length of primary key in varchar",如果不需要这1000长度可以改成varchar(250)
.
如果您在文本中收到电子邮件地址,您应该将您的 table 姓名放在 (`) 之间,如下所示:
String sql2="create table `"+emailId.getText()+"Inbox`
(InMsgs varchar(1000), primary key(InMsgs))";
使用 UCanAccess 3.0.3.1 我能够通过尝试 运行 使用 addBatch()
/executeBatch()
创建 TABLE 语句来重现您的问题。但是,如果每个 运行 独立使用 executeUpdate()
.
,它们似乎工作正常
此外,由于 VARCHAR 列的宽度超过 255 个字符,因此您的 CREATE TABLE 语句实际上会创建 tables "Memo" (a.k.a。"Long Text") 字段作为它们的主键。在 Access UI 中不允许创建这样的 table,因此应该考虑 "Not Recommended"。相反,使用类似这样的方法创建一个带有自动编号主键的 table:
String sql2="CREATE TABLE ["+emailId.getText()+"Inbox] (id COUNTER PRIMARY KEY, InMsgs MEMO)";
(...暂时忽略为每个 emailId
创建单独的相同 table 几乎肯定是个坏主意。)
这是我的部分代码。在此,当我执行 sql 语句时,create table 不会在数据库中创建任何 table,也不会抛出任何错误。这是为什么?
我在 JDK SE 8 和 MS-Access 中使用 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
使用 setAutoCommit()
方法
con.setAutoCommit(false);
最后,使用commit()
方法提交连接
con.commit();
代码:
st=con.createStatement();
con.setAutoCommit(false);
st.addBatch(sql1);
.................
st.executeBatch();
con.commit();
您的 table 未创建,因为您将主键设置为 varchar(1000)
,其中,主键的最大长度为 767 字节。因此您必须将密钥的长度减少到 767,这取决于您的 table 编码。设置varchar(767)不是说767字节,可以搜索"the length of primary key in varchar",如果不需要这1000长度可以改成varchar(250)
.
如果您在文本中收到电子邮件地址,您应该将您的 table 姓名放在 (`) 之间,如下所示:
String sql2="create table `"+emailId.getText()+"Inbox`
(InMsgs varchar(1000), primary key(InMsgs))";
使用 UCanAccess 3.0.3.1 我能够通过尝试 运行 使用 addBatch()
/executeBatch()
创建 TABLE 语句来重现您的问题。但是,如果每个 运行 独立使用 executeUpdate()
.
此外,由于 VARCHAR 列的宽度超过 255 个字符,因此您的 CREATE TABLE 语句实际上会创建 tables "Memo" (a.k.a。"Long Text") 字段作为它们的主键。在 Access UI 中不允许创建这样的 table,因此应该考虑 "Not Recommended"。相反,使用类似这样的方法创建一个带有自动编号主键的 table:
String sql2="CREATE TABLE ["+emailId.getText()+"Inbox] (id COUNTER PRIMARY KEY, InMsgs MEMO)";
(...暂时忽略为每个 emailId
创建单独的相同 table 几乎肯定是个坏主意。)