“线程中的异常”;“主要”;java.sql.SQLException:near";s";:语法错误

“线程中的异常”;“主要”;java.sql.SQLException:near";s";:语法错误,java,sqlite,Java,Sqlite,我写了一个程序,用单词列表填充数据库。问题是,每次我尝试运行代码时,它都会抛出“线程中的异常”main“java.sql.SQLException:near“s”:syntax error”。我知道在这个论坛上也有人问过类似的问题,但在我的代码中,我无法纠正错误 因此,我向你求助 这是密码 import java.io.*; import java.sql.*; import java.util.Scanner; public class db_populate { public s

我写了一个程序,用单词列表填充数据库。问题是,每次我尝试运行代码时,它都会抛出“线程中的异常”main“java.sql.SQLException:near“s”:syntax error”。我知道在这个论坛上也有人问过类似的问题,但在我的代码中,我无法纠正错误

因此,我向你求助

这是密码

import java.io.*;
import java.sql.*;
import java.util.Scanner;

public class db_populate {

    public static void main(String[] args) throws SQLException, IOException,
            ClassNotFoundException {
        Connection c = null;
        Statement stmt = null;
        Scanner in = null;
        String word;
        String wordcat;
        String j, sql;
        int i = 0;

        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:dictionary.db");
        c.setAutoCommit(false);
        System.out.println("Opened database successfully");

        stmt = c.createStatement();

        in = new Scanner(new File("wordsEn.txt"));

        while (in.hasNext()) {
            word = in.nextLine();
            i++;
            j = Integer.toString(i);
            wordcat = word.substring(0, 2);
            sql = "INSERT INTO WORDS (ID,CAT,WORD) " + "VALUES(" + j + ",'"
                    + wordcat + "','" + word + "');";
            stmt.executeUpdate(sql);
        }

        stmt.close();
        c.commit();
        c.close();
        in.close();
        System.out.println("Records created successfully");
    }

}
这些是我跑步时遇到的错误

Opened database successfully
Exception in thread "main" java.sql.SQLException: near "s": syntax error
    at org.sqlite.core.NativeDB.throwex(NativeDB.java:397)
    at org.sqlite.core.NativeDB._exec(Native Method)
    at org.sqlite.jdbc3.JDBC3Statement.executeUpdate(JDBC3Statement.java:116)
    at db_populate.main(db_populate.java:34)
用于避免错误输入的问题:

PreparedStatement p = c.prepare("INSERT INTO WORDS (ID,CAT,WORD) VALUES(?, ?, ?)");
p.setInt(1, i);
p.setString(2, wordcat);
p.setString(3, word);
p.execute();
//commit results if using InnoDB, etc

感谢Rogue提供的好代码。我在插入操作期间在SQLite中出错,SQL字符串在文本中包含“'”。所以,以这种方式逃跑对我有帮助。 我对代码做了一些修改

PreparedStatement prst = conn.prepareStatement(
    "INSERT INTO test(id, name, type) "
    + "VALUES(?, ?, ?)");
prst.setLong(1, id);
prst.setString(2, title);
prst.setObject(3, type);
prst.execute();

因此,当我尝试在INTEGER列中插入空值时,我使用了一个方法setObject()。

您可以打印sql字符串以便我们看到您传递给stmt.executeUpdate()的内容吗?创建连接时没有验证。你确定你的关系很好吗?此外,您应该考虑用Test/CcCH包围语句执行。为什么<代码> j=整数?toStand(i);<代码>
j
应该是一个
int
。我想用查询代替
j
keepi9ng
I
,可以解决您的问题。另外,在
sql的末尾,您不需要
您要插入的单词之一包含撇号,例如
此处的
,因此SQL语句包含语法错误。您确实应该使用一个准备好的语句,因为您的代码会受到SQL注入攻击。如果你不想使用预先准备好的语句,你不需要我投反对票,但需要详细说明:比如单词being
“don't”。
转义、格式(Date)和SQL注入:嗯,@Rogue和其他回答的人,谢谢……它起了作用!准备好的声明提示真的很有帮助,谢谢!插入字符串是一堆引号,这种方式更整洁。谢谢你的帮助@我理解的PreparedStatement中的JoopEggen允许数据库处理参数本身的转义,因此不需要以这种形式转义。@Rogue是的,我想说的是转义等优点。(很抱歉表述不清楚。)