2016-07-12 2 views
-1

Моя цель состояла в том, чтобы извлечь файл и разделить значения из файла и ввести значения в таблицу базы данных.ввод массива, извлеченного из файла в таблицу базы данных

Я создал таблицу примеров empp с двумя столбцами empname, empid. Я подключился к базе данных и попытался вставить запрос из «eclipse».

Теперь у меня есть файл fr.txt. Когда я читаю файл, разделяю значения и сохраняю их в массиве, я не могу использовать индексы массивов в запросе вставки.

вот мой код:

try{ 
    FileReader fr=new FileReader("C:\\Users\\Priyanka Sethi\\Desktop\\fr.txt"); 
    BufferedReader br=new BufferedReader(fr); 
    String str; 
    str=br.readLine(); 
    while((str=br.readLine())!=null){ 
     System.out.println(str+"\n");  
     String [] array = str.split("\\,"); 
     for (int i = 0; i < array.length; i++) { 
      System.out.println(array[i]); 
     } 
     String a=array[0]; 
     Integer b=Integer.parseInt(a); 
     String c=array[1]; 
     Connection con=getConnection(); 
     PreparedStatement posted=con.prepareStatement("INSERT INTO empp(empid,empname)VALUES(b,'c')"); 
     posted.executeUpdate(); 
    } 
} catch(Exception e){ 
    System.out.println(e); 
} finally { 
    System.out.println("insertion completed"); 
} 
+1

«Я не могу использовать индексы массива« Что вы имеете в виду? Вы получаете исключение, которое вы можете добавить к своему вопросу? – avojak

+0

Можете ли вы опубликовать образцы данных из файла? – Shank

+0

Просьба также ознакомиться с некоторыми ресурсами, касающимися дезинфекции данных SQL. Это поставит вас впереди конкурентов. – Aaron

ответ

2

Проблема заключается в том, как вы пытаетесь поместить значения в ваш PreparedStatement.

У вас есть:

PreparedStatement posted=con.prepareStatement("INSERT INTO empp(empid,empname)VALUES(b,'c')"); 

... который на самом деле не используя переменные b и c, которые вы создали в строках выше. Вместо этого попробуйте использовать методы PreparedStatement.setString(int, String) и PreparedStatement.setInt(int, int).

Для полного примера, посмотрите на это: http://www.tutorialspoint.com/javaexamples/jdbc_prepared_statement.htm

В вашем случае - не на самом деле работает ваш код, чтобы проверить - я меняю бы эту линию, чтобы выглядеть следующим образом:

PreparedStatement posted=con.prepareStatement("INSERT INTO empp(empid,empname)VALUES(?,?)"); 
posted.setInt(1, b.intValue()); 
posted.setString(2, c); 

ОТКАЗ

ВСЕГДА, ВСЕГДА, ВСЕГДА Валида te, sanitize и т. д. ANY ввод от пользователя. НИКОГДА не используйте непосредственно значения в любом запросе, который был предоставлен вне вашей программы, и НИКОГДА не делайте никаких предположений о том, что вводит пользователь. Это открывает вам широкий спектр уязвимостей. Использование передовой практики важно с самого начала!

+1

Хотя я предлагаю не отвечать на прямой вопрос, я настоятельно рекомендую вам добавить отказ от вставки значений, считываемых извне программы. Это сделает этот ответ еще лучше. Это одна из * больших * уязвимостей, которые новые программисты внедряют в системы, которые впоследствии подвергаются риску. – Aaron

+0

@ Аарон Ах да, определенно важная нота для добавления - спасибо за напоминание! – avojak

+0

Я не ожидал этого на такой громкой доске объявлений, но это все равно получает +1. – Aaron