执行更新时的 Java SQLSyntaxErrorException

问题描述

我正在创建一个数据库来跟踪蜘蛛侠漫画书。我在第 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