问题描述
我正在创建一个数据库来跟踪蜘蛛侠漫画书。我在第 28 行收到 sqlExecption
:
stmt.executeUpdate(createstring);"
因此,我认为 createstring
中的 sql 语法有问题,但没有任何提示。
下面是代码
import java.sql.*;
import javax.swing.*;
public class SpidermanDatabase {
public static void main(String[] args)
{
String url = "jdbc:ucanaccess://c:/users/jeff/comics.accdb";
Connection con;
String createstring;
createstring = "CREATE TABLE Spider-Man (" +
"ComicName varchar(40)," +
"IssueDate varchar(40)," +
"IssueName varchar(40)," +
"MintCond varchar(40)," +
"IssueValue double(2,2)," +
"IssueNum int)";
Statement stmt;
try
{
con = DriverManager.getConnection(url,"","");
stmt = con.createStatement();
stmt.executeUpdate(createstring);
JOptionPane.showMessageDialog(null,"Spider-Man table created","sql Statement Confirmation",JOptionPane.informatION_MESSAGE);
stmt.close();
con.close();
System.exit(0);
}
catch(sqlException ex)
{
System.out.println("sqlException");
System.out.println(ex.getMessage());
ex.printstacktrace();
}
}
}
所附图片已满 error message
解决方法
在我看来,您正在使用 Microsoft Access 数据库。您似乎也在使用 ucanaccess JDBC 驱动程序连接到该数据库。
您的问题是您在尝试创建的表的名称中使用了非法字符。根据 Microsoft documentation,标识符,例如数据库表名称,不能包含破折号 (-
)(也称为连字符)——除非您将标识符括在任一方括号中,即 {{1 }},或引号。
因此,您应该将 SQL create table 字符串更改为以下内容:
[]
另请注意,createstring = "CREATE TABLE [Spider-Man] (" +
"ComicName varchar(40)," +
"IssueDate varchar(40)," +
"IssueName varchar(40)," +
"MintCond varchar(40)," +
"IssueValue double," +
"IssueNum int)";
数据类型不能具有标度和精度限定符。因此,我还从 double
列的数据类型中删除了 (2,2)
部分。
请记住,在此之后,您必须始终将 IssueValue
(或 [Spider-Man]
)写为所有 SQL 语句中的表名。或者,您可以将破折号替换为下划线 ("Spider-Man"
),后者是标识符中的合法字符,从而无需方括号(或引号),即命名表为 _
.
编辑
尽管上面的 Spider_Man
语句是有效的 SQL,但 ucanaccess JDBC 驱动程序似乎无法处理它。我让它工作的唯一方法是用下划线替换破折号。
这是我创建数据库表CREATE TABLE
的java代码。
(请注意,以下代码使用 try-with-resources。)
Spider_Man