У пользователя базы данных HSQL нет прав или объект не найден. Попробуйте вставить данные в базу данных. - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь прочитать данные из текстового файла, а затем вставить в базу данных, но постоянно получаю сообщение об ошибке.

Ниже код, который я пишу

Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:TestDB", "sa", "123");
connection.prepareStatement("drop table people if exists;").execute();
connection.prepareStatement("create table people (id integer, name varchar(20) not null, picture varchar(20), detail varchar(40), gender varchar(5), age integer, state varchar(5), primary key(id));").execute();
String fileName = "/Users/da/Desktop/AP Assignment 2/people.txt";
BufferedReader br = new BufferedReader(new FileReader(fileName));
while (strLine != null) {
    String data[] = null;
    strLine = br.readLine();
    data = strLine.split(",");
    int id = Integer.parseInt(data[0]);
    String name = data[1];
    String picture = data[2];
    String detail = data[3];
    String gender = data[4];
    int age = Integer.parseInt(data[5]);
    System.out.println(age);
    String state = data[6];
    String sql = "insert into people(id, name, picture, detail, gender, age, state) values (" + id + "," + name + ", " + picture + ", " + detail + ", " + gender + ", " + age + ", " + state + ")";
    connection.prepareStatement(sql).execute();
    connection.commit();
}
br.close();

1 Ответ

0 голосов
/ 06 мая 2018

Пытаясь встроить значения данных в строку SQL, вы создали проблему SQL Injection . Например, код

int id = 1;
String name = "gord";
String sql = "INSERT INTO people (id, name) VALUES (" + id + ", " + name + ")";
System.out.println(sql);

печать

INSERT INTO people (id, name) VALUES (1, gord)

Когда мы пытаемся выполнить этот оператор, анализатор запросов распознает 1 как целочисленный литерал, но интерпретирует gord как имя столбца, поэтому мы получим ошибку «пользователю не хватает привилегий или объект не найден».

Решение заключается в использовании параметризованного запроса , например:

int id = 1;
String name = "gord";
String sql = "INSERT INTO people (id, name) VALUES (?, ?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, name);
ps.executeUpdate();
...