Я получаю в моей базе данных имя переменной, но не значение переменной - PullRequest
0 голосов
/ 02 мая 2018

Я хочу получить данные из определенного столбца из текстового файла и сохранить их в определенном столбце в базе данных. Переменная NumberOfLine сохраняется в базе данных, но я хочу значение этой переменной, которое должно быть некоторым числом (в виде строки), я не понимаю, почему она не работает. У вас есть какие-нибудь предложения?

import java.io.*;
import java.util.*;
import java.sql.*;
public class TxtFile {

    public static void main(String[] args) throws IOException {

        try{  
            Class.forName("com.mysql.jdbc.Driver");  
            Connection con=DriverManager.getConnection(  
            "jdbc:mysql://localhost:3306/schemaDB","acc:#####","pass:#####"); 

                System.out.print("Successful connection with MySQL!");
                BufferedReader br = new BufferedReader(new FileReader("C:\\lotto.txt"));

             String line;
                String NumberOfLine = "";
                String SecondNumber = "";
                while ((line = br.readLine()) != null) {
                    String[] splited = line.split("\\s");

                    //take value of  column 4 from txt file
                    NumberOfLine = splited[3];

                    //save the current number into the DB
                    Statement stmt=con.createStatement(); 
                    stmt.executeUpdate("INSERT INTO `kanat`(Number1) VALUE ('"+NumberOfLine+"')");
                }
                br.close();
                con.close(); 

                System.out.println("Finished! ");

            }catch(Exception e){
                System.out.println("No success! " + e);
                }  
            }  

}

enter image description here

1 Ответ

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

Оператор INSERT искажен. Ключевое слово: VALUES, а не VALUE.

Это может быть легко отлажено путем вывода текста SQL и передачи его другому клиенту.

Слишком много работы делается в одной строке; и выполняемая работа является сломанной , поскольку она уязвима для SQL-инъекций.

Здесь нет необходимости использовать конкатенацию строк для динамической подготовки текста SQL. И нет необходимости многократно отрабатывать создание и воссоздание sql и оператора ...

  String sql = "INSERT INTO `kanat`(Number1) VALUES ( ? )";
  PreparedStatement ps = null;

  try {

     ps = con.prepareStatement(sql);

     while( ... ) {
        String numberOfLine = ...

        ps.setString(1, numberOfLine);
        ps.executeUpdate();

     }
  } catch (SQLException e ) {
      e.printStackTrace();
  } finally {
      if (ps != null) {
          ps.close();
      }
  }

Followup

Если цель состоит в том, чтобы просто загрузить новые строки в таблицу, читая один «столбец» из файла .txt с разделителями-пробелами, лично я бы не возился с написанием неэффективного кода Java и обработкой RBAR (строки путем агонизирующей строки).

Я бы просто использовал встроенный оператор MySQL LOAD DATA и взорвал весь файл за одну транзакцию.

Примерно так:

 LOAD DATA LOCAL INFILE "/tmp/myfile.txt" 
 INTO TABLE mytable
 FIELDS TERMINATED BY ' ' 
 LINES TERMINATED BY '\n'
 IGNORE 1 LINES
 ( @d1
 , @d2
 , @d3
 , @d4
 , @d5
 , @d5
 , @d6
 ) 
 SET mycol = TRIM(BOTH FROM @d4)
 ;

Если это необычно большой файл, который мне нужно загрузить, так как я не хочу, чтобы транзакции "Hugh Jass" выдували системное табличное пространство innodb (пространство, которое я не могу вернуть), я бы либо разделил файл ( OS split команда), или мужской набор инструментов Percona pt-fifo-split, чтобы разбить файл на трубу на лету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...