【问题标题】:"[SQLITE_ERROR] SQL error or missing database (near "DATABASE": syntax error)"“[SQLITE_ERROR] SQL 错误或缺少数据库(靠近“DATABASE”:语法错误)”
【发布时间】:2017-12-28 20:07:19
【问题描述】:

我正在尝试使用 JDBC 在文件夹 D:\sqlite 中创建一个名为 test 的新数据库文件,如下所示:

import java.sql.*;

public class Class1 {

    private static void createNewDataBase(){

        String url = "jdbc:sqlite:D:sqlite/";
        Connection conn = null;
        Statement statement = null;

        try{

            conn = DriverManager.getConnection(url);
            System.out.println("Connection Established");
            statement = conn.createStatement();

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        try {
            statement.execute("CREATE DATABASE test");

        } catch (SQLException e) {
            System.out.println(e.getMessage());

        } finally{
            try{
                if(statement != null)
                    statement.close();

            }catch(SQLException e){
                System.out.println(e.getMessage());
            }

            try{
                if(conn != null)
                    conn.close();

            }catch(SQLException e){
                System.out.println(e.getMessage());
            }
        }
    }

    public static void main(String[] args){
        createNewDataBase();
    }

}

当我运行项目时,我得到以下输出:

Connection Established
[SQLITE_ERROR] SQL error or missing database (near "DATABASE": syntax error)

Process finished with exit code 0

它说语法错误,但我找不到错误。我一直在寻找类似问题的答案,但没有一个能解决我的问题。谁能告诉我有什么问题?提前致谢!

【问题讨论】:

  • SQLite 中没有CREATE DATABASE 语句。见documentation。为什么你认为有?
  • 可能是一个反问,但如果不使用 SQL,SQLite 的功能更少,并且增加了一层额外的复杂性,那么它的意义何在?
  • @JacobH - 嗯,因为它是 SQL,但是 Lite?它是一个轻量级的无服务器关系数据库引擎。它没有CREATE DATABASE,因为您只需创建一个不同的实例。不考虑用户,因为执行进程是唯一的用户。等等等等。
  • SQL(标准)中没有CREATE DATABASE

标签: java sql sqlite jdbc


【解决方案1】:

正如@Andreas 所述,SQLite 没有CREATE DATABASE SQL 语句。要创建一个新的 SQLite 数据库,您只需要建立一个连接,它就会自动创建(但是您需要确保 D:/sqlite/ 路径已经存在于 local文件系统)。

以下代码应在位于根目录的文件夹 sqlite 中创建一个名为 MyNewDatabase.sqliteempty(无表)SQLite 数据库本地文件系统的 D 驱动器:

String dbPath = "D:/sqlite/MyNewDatabase.sqlite";
Connection conn = null;
try {
   Class.forName("org.sqlite.JDBC");
   conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath;);
}
catch (ClassNotFoundException ex) { 
    ex.printStackTrace();
}
catch (SQLException ex) { 
    ex.printStackTrace();
}
finally {
    try { 
        if (conn != null) { 
            conn.close(); 
        } 
    } 
    catch (SQLException e) { e.printStackTrace(); }
}

现在您需要为您的新数据库创建一个或多个表以使其有用。 SQLite 确实接受CREATE TABLE SQL 语句,如果需要,您可以通过相同的连接执行此操作。

【讨论】:

    【解决方案2】:

    数据库存在,已经连接,即数据库就是连接,基本上就是文件。因此,CREATE DATABASE 没有 SQL。

    在数据库中,您通常会创建表(可能还有其他组件)。

    例如CREATE TABLE mytable (mycolumn TEXT, myothercolumn INTEGER) 将创建一个名为 mytable 的表,其中包含 2 列 mycolumnmyothercolumn(前者使用 TEXT 列类型定义,后者的列类型为 INTEGER)。

    因此,如果您要更改:-

         statement.execute("CREATE DATABASE test");
    

    到:-

        statement.execute("CREATE TABLE mytable (mycolumn TEXT, myothercolumn INTEGER)");
    
    • 请注意,您只想执行一次,否则会因为表已经存在而失败,因此您可以使用CREATE TABLE IF NOT EXISTS mytable (mycolumn TEXT, myothercolumn INTEGER),当然这取决于您的要求。

    您可能会发现它会起作用。显然,您将需要做其他事情,例如添加一些数据,因为表将为空。

    也许然后试试

        statement.execute("INSERT INTO mytable VALUES('fred',100)");
    

    每次运行时都会在表名 mytable 中添加一个新 ROW。

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2017-02-11
      • 2021-07-31
      • 1970-01-01
      • 2018-01-19
      • 2016-08-14
      • 2022-06-15
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多