首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建带有预先填充信息的表时出现SQLITE数据库错误(表有3列,但提供了2个值)

创建带有预先填充信息的表时出现SQLITE数据库错误(表有3列,但提供了2个值)
EN

Stack Overflow用户
提问于 2018-10-02 18:39:15
回答 2查看 242关注 0票数 0

因此,我正在使用Eclipse学习Java。我已经写了一些我的插件,但这是我的第一个驱动桌面程序,我正在为我的地方社区中心编写。

这个程序需要使用一个数据库,所以我将使用一个本地数据库,而不是基于云的数据库,因为我只是进入这个过程。

我在数据库上工作了一段时间,似乎无法克服以下错误: SQL错误或缺少数据库(表用户有3列,但提供了2个值)

下面是我的代码和错误的屏幕截图。

提前谢谢,~斯通

全班学生如下:

代码语言:javascript
复制
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行更改为:

代码语言:javascript
复制
state2.execute("CREATE TABLE user(id INTEGER AUTOINCREMENT," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");

现在我得到了这个错误:"SQL错误或缺少数据库(接近"AUTOINCREMENT":语法错误)“

我只是没有按正确的顺序输入

图片如下:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-02 19:10:19

如前所述,出现此错误的原因是要插入具有三列但存储过程仅为两个列提供值的表。

您希望数据库为您提供id值。您的数据库可以做到这一点,如果您将表设置为这样的话,那么您的存储过程就会正常工作。您需要告诉数据库对USER表进行自动增量(使用id值处的内部rowid )。这是数据库表定义的一部分,方法是添加整数主键或整数AUTOINCREMENT,为ID列添加数据类型。

代码语言:javascript
复制
state2.execute("CREATE TABLE user(id integer," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");

应该是

代码语言:javascript
复制
state2.execute("CREATE TABLE user(id INTEGER PRIMARY KEY," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");

代码语言:javascript
复制
state2.execute("CREATE TABLE user(id INTEGER AUTOINCREMENT," + "firstname varchar(60)," + "lastname varchar(60)," + "primary key(id));");
票数 0
EN

Stack Overflow用户

发布于 2018-10-02 18:45:08

这个错误确实说明了所有问题--该表有三列,但插入时只提供其中的两列。如果要这样做,需要显式列出要插入的列。

另外,顺便指出的是,您不需要创建另一个PreparedStatement,但是可以重用相同的一个:

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52614441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档