【问题标题】:No such Table Sqlite JDBC没有这样的 Table Sqlite JDBC
【发布时间】:2015-10-25 13:40:23
【问题描述】:

各位。我面临的问题很奇怪.. 我首先创建一个表,然后尝试将数据放在上面,但由于某种原因,有些事情正在发生。它说

[SQLITE_ERROR] SQL error or missing database (no such table: Name)

这是我的基本代码..

try{
                Class.forName("org.sqlite.JDBC");
                  conni  = DriverManager.getConnection("jdbc:sqlite://C://Users//Asus//Dropbox//TireShop.sqlite");


                  stmt = conni.createStatement();

                  String sql = "CREATE TABLE " + project.getText() + " (Id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , Name TEXT, One TEXT, Two TEXT)";


                  stmt.executeUpdate(sql);
                  stmt.close();
                  conni.close();
            }catch (Exception e){
                System.err.println( e.getClass().getName() + ": " + e.getMessage() );
                  System.exit(0);

            }
            try{
                Class.forName("org.sqlite.JDBC");
                  conni  = DriverManager.getConnection("jdbc:sqlite://C://Users//Asus//Dropbox//TireShop.sqlite");

                  String query1 = "insert into Name (Name) values(?)";
                  PreparedStatement pst = conni.prepareStatement(query1);
                  pst.setString(1, project.getText());
                  pst.execute();
                  pst.close();
                  conni.close();
            }catch(Exception e){
                System.err.println( e.getClass().getName() + ": " + e.getMessage() );
                  System.exit(0);


            }
            try{
                Class.forName("org.sqlite.JDBC");
                  conni  = DriverManager.getConnection("jdbc:sqlite://C://Users//Asus//Dropbox//TireShop.sqlite");

                  String query1 = "insert into " + project.getText() + "(Name, One, Two) values(?,?,?)";
                  PreparedStatement pst = conni.prepareStatement(query1);
                  pst.setString(1, project.getText());
                  pst.setString(2, textField_one.getText());
                  pst.setString(3, textFieldtwo.getText());
                  pst.execute();
                  pst.close();
                  conni.close();
            }catch(Exception e){
                System.err.println( e.getClass().getName() + ": " + e.getMessage() );
                  System.exit(0);
            JOptionPane.showMessageDialog(null, "Thank you");

感谢您的帮助!我真的能理解......我猜这个表根本没有被创建,但它实际上工作了一次。所以这让我更加困惑o.o

【问题讨论】:

  • project.getText() 的值是多少?在您的代码中,您同时使用project.getText() 和字符串“名称”。为什么?

标签: java mysql sqlite jdbc


【解决方案1】:

Name 是一个MySql reserved keyword。将表重命名为其他名称。

【讨论】:

  • 这实际上帮助了很多伙伴。谢谢!
【解决方案2】:

请用" 将您的字段名括起来以转义它们。

String sql = "CREATE TABLE \"" + project.getText() + "\" (\"Id\" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , \"Name\" TEXT, \"One\" TEXT, \"Two\" TEXT)";

 String query1 = "insert into \"Name\" (\"Name\") values(?)";

 String query1 = "insert into \"" + project.getText() + "\" (\"Name\", \"One\", \"Two\") values(?,?,?)";

另外...我假设您已经从代码中的各个点将这些代码 sn-ps 修补在一起...

但我建议您在代码中设置一个 SINGULAR 数据库连接,并在整个应用程序中重用该连接。 大致如下:

public class MyApp {
     public static Connection DB;
     public void initDatabase() {
         try {
             MyApp.DB = DriverManager.getConnection("jdbc:sqlite://C://Users//Asus//Dropbox//TireShop.sqlite");
          }
          catch(Exception ex) {
          }
     }
     public static void main(String args[]) {  
         MyApp app = new MyApp();
         app.initDatabase();
     }
}

【讨论】:

  • 当然可以,因为您不再使用保留名称,但这只是一种很好的做法。正如您使用制表符或空格来标识代码一样,将括号放在相同的位置,您应该始终将字段名括起来,无论数据库引擎如何。
  • 很好,这将有助于防止未来出现很多错误:-)
猜你喜欢
  • 2012-10-16
  • 2013-03-07
  • 1970-01-01
  • 2012-10-31
  • 2022-01-05
  • 2015-04-20
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多