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