因此,我正在使用Eclipse学习Java。我已经写了一些我的插件,但这是我的第一个驱动桌面程序,我正在为我的地方社区中心编写。
这个程序需要使用一个数据库,所以我将使用一个本地数据库,而不是基于云的数据库,因为我只是进入这个过程。
我在数据库上工作了一段时间,似乎无法克服以下错误: SQL错误或缺少数据库(表用户有3列,但提供了2个值)
下面是我的代码和错误的屏幕截图。
提前谢谢,~斯通


全班学生如下:
package main;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLiteConnect {
private static Connection con;
private static boolean hasData = false;
public ResultSet displayUsers() throws ClassNotFoundException, SQLException {
if (con == null) {
getConnection();
}
Statement state = con.createStatement();
ResultSet res = state.executeQuery("SELECT firstname, lastname FROM user");
return res;
}
private void getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.sqlite.JDBC");
con = DriverManager.getConnection("jdbc:sqlite:SQLiteConnect.db");
initialise();
}
private void initialise() throws SQLException {
if ( !hasData) {
hasData = true;
Statement state = con.createStatement();
ResultSet res = state.executeQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='user'");
if ( !res.next() ) {
System.out.println("Building the User table with prepopulated values.");
//need to build the table before you can call it if it doesn't already exist
Statement state2 = con.createStatement();
state2.execute("CREATE TABLE user(id integer," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");
// insert sample data
PreparedStatement prep = con.prepareStatement("INSERT INTO user values(?,?);");
prep.setString(1, "John");
prep.setString(2, "McNeil");
prep.execute();
PreparedStatement prep2 = con.prepareStatement("INSERT INTO user values(?,?);");
prep2.setString(1, "Paul");
prep2.setString(2, "Smith");
prep2.execute();
}
}
}
public void addUser (String firstname, String lastname) throws ClassNotFoundException, SQLException {
if (con == null) {
getConnection();
}
PreparedStatement prep = con.prepareStatement("INSERT INTO user values(?,?);");
prep.setString(1, firstname);
prep.setString(2, lastname);
prep.execute();
}}
-编辑1
好的,我将代码从第43行更改为:
state2.execute("CREATE TABLE user(id INTEGER AUTOINCREMENT," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");现在我得到了这个错误:"SQL错误或缺少数据库(接近"AUTOINCREMENT":语法错误)“
我只是没有按正确的顺序输入
图片如下:

发布于 2018-10-02 19:10:19
如前所述,出现此错误的原因是要插入具有三列但存储过程仅为两个列提供值的表。
您希望数据库为您提供id值。您的数据库可以做到这一点,如果您将表设置为这样的话,那么您的存储过程就会正常工作。您需要告诉数据库对USER表进行自动增量(使用id值处的内部rowid )。这是数据库表定义的一部分,方法是添加整数主键或整数AUTOINCREMENT,为ID列添加数据类型。
state2.execute("CREATE TABLE user(id integer," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");应该是
state2.execute("CREATE TABLE user(id INTEGER PRIMARY KEY," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");或
state2.execute("CREATE TABLE user(id INTEGER AUTOINCREMENT," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");发布于 2018-10-02 18:45:08
这个错误确实说明了所有问题--该表有三列,但插入时只提供其中的两列。如果要这样做,需要显式列出要插入的列。
另外,顺便指出的是,您不需要创建另一个PreparedStatement,但是可以重用相同的一个:
PreparedStatement prep =
con.prepareStatement("INSERT INTO user (firstname, lastname) VALUES (?, ?;");
prep.setString(1, "John");
prep.setString(2, "McNeil");
prep.executeUpdate();
prep.setString(1, "Paul");
prep.setString(2, "Smith");
prep.executeUpdate();https://stackoverflow.com/questions/52614441
复制相似问题