2013-10-25 5 views
0

Я создаю ArrayList из моей базы данных дерби вроде этого:Как вставить в ArrayList в базе данных

public ArrayList<ArrayList<String>> createArray(String ticket, JLabel message){ 


String sl = ticket; 
List rowData ; 
List<String> columnHeaders; 
ArrayList<ArrayList<String>> tableData = null; 

try{ 
conn= new data.connection().db(); 
String query="SELECT * FROM SERVICE_TICKET WHERE TICKET_NO ='"+sl+"' "; 
stmtt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
rs = stmtt.executeQuery(query); 
md = rs.getMetaData(); 
      int count = md.getColumnCount(); 
      columnHeaders = new ArrayList<>(); 
      tableData = new ArrayList<>(); 
     /* 
       for (int i = 1; i <= count; i++) { 
       columnHeaders.add(md.getColumnName(i)); 
       System.out.print(columnHeaders); 
      } 

     */ 
      while (rs.next()) { 
       rowData = new ArrayList<>(); 
       for (int i = 2; i <= count; i++) { 
        rowData.add(rs.getObject(i)); 
        message.setText(rs.getObject(i).toString()); 
       } 
       tableData.add((ArrayList<String>) rowData); 
      } 
      System.out.println(tableData); 
} 
catch (SQLException ex) { 
JOptionPane.showMessageDialog(null, "Unknown Error!! Data cannot be displayed!"+ex); 
} 
finally{try{stmtt.close(); conn.close(); rs.close();} catch(SQLException ex){}} 

return tableData; 
    } 

и пытается вставить данные в удаленной базе данных MySQL, как это:

public void save(String ticket, JLabel message){ 

ArrayList<ArrayList<String>> tableData = createArray(ticket, message); 


String query = "INSERT INTO SERVICE_TICKET(ID, TICKET_NO, " // VARCHAR(40), 
    +" SL_NO, " //INTEGER, 
    +" CODE, " // VARCHAR(30), 
    +" ITEM_NAME, " // VARCHAR(300), 
    +" GROUP_NAME, " // VARCHAR(50), 

    +" QNTY, " // INTEGER, 
    +" UNIT, " // VARCHAR(30), 
    +" TAXABLE, " // VARCHAR(3), 
    +" BONUSABLE, " // VARCHAR(3), 

    +" PRICE, " // DECIMAL(30 , 2), 
    +" AMOUNT, "// DECIMAL(30, 2) DEFAULT 0.00, 

    +" DISC_PERCENTAGE, " // DECIMAL(30, 2) DEFAULT 0.00, 
    +" DISCOUNT, " // DECIMAL(30, 2) DEFAULT 0.00, 

    +" FEDERAL, " // DECIMAL(30, 2) DEFAULT 0.00, 
    +" GST, " // DECIMAL(30, 2) DEFAULT 0.00, 
    +" TOTAL_TAX, " // DECIMAL(30, 2) DEFAULT 0.00, 

    +" NET_AMOUNT) " // DECIMAL(30 , 2) 
     +" VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" ; 


try{ 
    Class.forName("java.sql.Driver"); 
    conn = DriverManager.getConnection("jdbc:mysql://www.example.com:3306/myDatabase", "user_1", "password_123"); 
    conn.setAutoCommit(false); 
    stmt = conn.prepareStatement(query); 
if(conn != null){ 
JOptionPane.showMessageDialog(null, "Connected to Internet....");} 
else{JOptionPane.showMessageDialog(null, "Failed to connect to the server");} 


    for(int i = 0; i<tableData.size(); i++){ 
    ArrayList<String> innerList = (ArrayList<String>)tableData.get(i); 
    for(int j = 0; j<innerList.size(); j++){ 

    stmt.setString(1, innerList.get(j).toString()) ; // TICKET_NO VARCHAR(40), 
    stmt.setInt(2, Integer.parseInt(innerList.get(j).toString())) ; //SL_NO INTEGER, 
    stmt.setString(3, innerList.get(j).toString()) ; //CODE VARCHAR(30), 
    stmt.setString(4, innerList.get(j).toString()) ; //ITEM_NAME VARCHAR(300), 
    stmt.setString(5, innerList.get(j).toString()) ; // GROUP_NAME VARCHAR(50), 

    stmt.setInt(6, Integer.parseInt(innerList.get(j).toString())) ; // QNTY INTEGER, 
    stmt.setString(7, innerList.get(j).toString()) ; // UNIT VARCHAR(30), 
    stmt.setString(8, innerList.get(j).toString()) ; // TAXABLE VARCHAR(3), 
    stmt.setString(9, innerList.get(j).toString()) ; // BONUSABLE VARCHAR(3), 

    stmt.setDouble(10, Double.parseDouble(innerList.get(j).toString())) ; // PRICE DECIMAL(30 , 2), 
    stmt.setDouble(11, Double.parseDouble(innerList.get(j).toString())) ; // AMOUNT DECIMAL(30, 2) DEFAULT 0.00, 

    stmt.setDouble(12, Double.parseDouble(innerList.get(j).toString())) ; // DISC_PERCENTAGE DECIMAL(30, 2) DEFAULT 0.00, 
    stmt.setDouble(13, Double.parseDouble(innerList.get(j).toString())) ; // DISCOUNT DECIMAL(30, 2) DEFAULT 0.00, 

    stmt.setDouble(14, Double.parseDouble(innerList.get(j).toString())) ; // FEDERAL DECIMAL(30, 2) DEFAULT 0.00, 
    stmt.setDouble(15, Double.parseDouble(innerList.get(j).toString())) ; // GST DECIMAL(30, 2) DEFAULT 0.00, 
    stmt.setDouble(16, Double.parseDouble(innerList.get(j).toString())) ; // TOTAL_TAX DECIMAL(30, 2) DEFAULT 0.00, 

    stmt.setDouble(17, Double.parseDouble(innerList.get(j).toString())) ; // NET_AMOUNT DECIMAL(30 , 2) 

    stmt.addBatch(); 

    stmt.executeBatch(); 
    conn.commit(); 

}} 

    JOptionPane.showMessageDialog(null, "Data saved successfully."); 
} 
catch(SQLException | ClassNotFoundException ex){JOptionPane.showMessageDialog(null, "Cannot Save"+ex);} 
finally{ 
try{ 
    stmt.close(); conn.close(); conn.setAutoCommit(true); 
}catch(SQLException ex){} 
} 
} 

Аррайалист отлично отображает консоль. Но это всегда дает NumberFormatException ... Что не так в моем коде?

Еще один вопрос: есть ли другой вариант, чтобы я мог вставлять данные таблицы с локального компьютера (работающего в базе данных Derby) в удаленную базу данных MySQL? Пожалуйста, помогите.

+0

Будет ли это излишним для вашего приложения, если вы должны использовать JPA, чтобы вам не нужно было писать весь код уровня данных вручную? Если это так, я мог бы извлечь пример, как это сделать с Derby. – axiopisty

+0

Мне просто нужно решение. Но что случилось с arraylist и моим кодом? –

+0

Может быть, при вводе данных из дерби в MySQL вы делаете неправильное преобразование. Вы пытаетесь вставить строку в числовое поле. Проверьте свое числовое значение в дерби, которое может содержать некоторый символ или строку – Shamse

ответ

0

Возникла проблема с вашей петлей. Вы должны вынуть stmt.executeBatch(); conn.commit(); и держаться сторона для цикла

+1

Правда, это еще одна ошибка, хотя и не вызывающая наблюдаемое 'NumberFormatException' ... –

+0

Почему это получило нижний предел? Ошибочный код довольно беспорядок, и Шива просто попытался помочь, обнаружив еще одну проблему, которая привела бы к еще одному вопросу ... –

1

Здесь вы ошибаетесь:

Обратите внимание, что вы всегда доступ к такому же индексу из innerList: j. Когда на самом деле вы, вероятно, хотите что-то больше вдоль линий

for (int j = 0; j < innerList.size(); j++) { 
    stmt.setObject(j + 1, innerList.get(j)); 
} 

Кроме того, Siva Mondi также имеет правильное наблюдение с executeBatch() и commit() быть на уровне неправильного цикла. Наглядно, я бы сказал, что есть около 1-2 других проблем в этом коде ... Как уже упоминались в комментариях, вы можете быть действительно лучше с более высоким уровнем абстракции, такими как JPA, Spring JDBC или jOOQ

+0

Буду рад узнать о проблемах в моем коде. –

+0

Как я уже говорил.Вы всегда получаете один и тот же индекс 'j' из вашего' innerList' для каждого столбца, когда на самом деле 'innerList' содержит одно значение для каждого столбца. –

+0

В любом случае, Как избавиться от него? –

1

Пожалуйста внимательно проверьте эти строки:

stmt.setDouble(10, Double.parseDouble(innerList.get(j).toString())) ; // PRICE DECIMAL(30 , 2), 
stmt.setDouble(11, Double.parseDouble(innerList.get(j).toString())) ; // AMOUNT DECIMAL(30, 2) DEFAULT 0.00, 

stmt.setDouble(12, Double.parseDouble(innerList.get(j).toString())) ; // DISC_PERCENTAGE DECIMAL(30, 2) DEFAULT 0.00, 
stmt.setDouble(13, Double.parseDouble(innerList.get(j).toString())) ; // DISCOUNT DECIMAL(30, 2) DEFAULT 0.00, 

stmt.setDouble(14, Double.parseDouble(innerList.get(j).toString())) ; // FEDERAL DECIMAL(30, 2) DEFAULT 0.00, 
stmt.setDouble(15, Double.parseDouble(innerList.get(j).toString())) ; // GST DECIMAL(30, 2) DEFAULT 0.00, 
stmt.setDouble(16, Double.parseDouble(innerList.get(j).toString())) ; // TOTAL_TAX DECIMAL(30, 2) DEFAULT 0.00, 

stmt.setDouble(17, Double.parseDouble(innerList.get(j).toString())) ; // 

Вы пытаетесь разобрать строку на двойное значение. Но строка не является двойным, что приводит к исключению NumberFormatException. Например:

Double a = Double.parseDouble("asd"); //java.lang.NumberFormatException occurs 
Смежные вопросы