簡體   English   中英

CREATE TABLE語句在executeBatch下靜默失敗

[英]CREATE TABLE statements silently failing under executeBatch

這是我的代碼部分。 在這種情況下,當我執行sql語句時,create表不會在數據庫中創建任何表,並且不會引發任何錯誤。 為什么是這樣?

我正在將NetBeans與帶有MS-Access的JDK SE 8一起使用。

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();

使用UCanAccess 3.0.3.1,通過嘗試使用addBatch() / executeBatch()運行CREATE TABLE語句,我能夠重現您的問題。 但是,如果每個人都使用executeUpdate()獨立運行,它們似乎可以正常工作。

另外,由於VARCHAR列的寬度超過255個字符,因此您的CREATE TABLE語句實際上將創建以“備注”(aka“ Long Text”)字段作為主鍵的表。 在Access UI中不允許創建這樣的表,因此應該將其視為“不推薦”。 而是,使用如下所示的方法來創建具有AutoNumber主鍵的表:

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

(...目前暫時忽略為每個emailId創建相同的表這一事實幾乎是一個壞主意。)

首先,使用setAutoCommit()方法將set auto commit設置為false

 con.setAutoCommit(false);

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

 con.commit();

碼:

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

由於將主鍵設置為varchar(1000) ,因此無法創建表,其中主鍵的最大長度為767個字節。 因此您必須將鍵的長度減小為767,這取決於表的編碼。 設置varchar(767)並不意味着767個字節,您可以搜索“ varchar中主鍵的長度”,如果不需要此1000長度,則可以更改為varchar(250)

如果您在文本中收到電子郵件地址,則應將表格名稱放在(`)之間,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM