insert into... Java do Oracle

0

witam serdecznie,

mam mały problem. Działami kilka przycisków, ale brakuje mi jednego "insert" z upload już sobie sama powinnam poradzić. Na podstawie rozwiązania problemu z dodawaniem danych do BD Oracle. Dane są pobrane z:

id jTextField3
country_name jTextField3
region jTextField3

nie wiem jak pobrać dane jTextField3

próbowałam w następujący sposób, ale nie powidło mi się :(
<font size="3"> /* -------</span>

  1. String sql = " INSERT INTO countries VALUES ('" + jTextField1+ "','" + jTextField2 + "','" +jTextField3 + "')";
  2. String sql = " INSERT INTO countries VALUES ('" + idx+ "','" + country_name + "','" +region + "')";
  3. utworzyłam, również klasę Dane, gdzie były metody getXXX i setXX chciałam pobrać je do
    String sql = " INSERT INTO countries VALUES ('" + getId() + "','" + getCountry_name() + "','" +getRegion() + "')";

ale tu też był błąd
4) napisałam również procedurę PL/SQL:

set serveroutput on
CREATE OR REPLACE PROCEDURE dodajWiersz_countries(v_id countries.id%TYPE,v_country_name countries.country_name%TYPE,v_region countries.region%TYPE)
IS
BEGIN
INSERT INTO countries VALUES(v_id,v_country_name,v_region);
EXCEPTION
WHEN dup_val_on_index THEN
dbms_output.put_line('Zły ID');
END dodajWiersz_countries;
/
show err
Działa w Oraclu:

exec dodajWiersz_countries(8,'USA',17)

Próbowałam wiec , tak :

String sql = "execute dodajWiersz_countries(?,?,?)";
ale tez nie dodaje to rezultatu
<font size="3">------- */</span>

Ktoś z Was ma jakąś wskazówkę, jak mam pobrać dane z formularza? Kod mój przedstawia się następująco:

package panel;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

public class Panel extends javax.swing.JFrame {

public Panel() {
    initComponents();
}

private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    jTextField1.setText(null);
    jTextField2.setText(null);
    jTextField3.setText(null);
    jTextArea1.requestFocus();
}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
 
    System.exit(0);
}                                        

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    int idx = Integer.parseInt(jTextField1.getText());
    String country_name = jTextField2.getText();
    int region = Integer.parseInt(jTextField3.getText());
    String driver = "oracle.jdbc.driver.OracleDriver";
    String serverName = "localhost";
    String portNumber = "1521";
    String sid = "XE";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    String pass = "ola";
    String user = "ola";
    String sql = " INSERT INTO countries VALUES ('" + idx + "','" + country_name + "','" + region + "')";

    try {
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, user, pass);
        PreparedStatement cs = con.prepareStatement(sql);

        cs.setInt(1, idx);
        cs.setString(2, country_name);
        cs.setInt(3, region);

        cs.close();
        con.close();

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
    }
}                                        

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String driver = "oracle.jdbc.driver.OracleDriver";
    String serverName = "localhost";
    String portNumber = "1521";
    String sid = "XE";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    String pass = "kasia";
    String user = "kasia";
    String sql = "select * from countries";

    try {
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, user, pass);
        PreparedStatement ps = con.prepareStatement(sql);

        ResultSet rs = ps.executeQuery();
        jTextArea1.setText(null);
        while (rs.next()) {
            jTextArea1.append(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getInt(3) + "\n");
        }
        ps.close();
        con.close();


    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());

    }
}                                        

public static void main(String args[]) {

    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (Exception e) {
    }

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new Panel().setVisible(true);
        }
    });
}
private javax.swing.JMenuItem aboutMenuItem;
private javax.swing.JMenuItem contentsMenuItem;
private javax.swing.JMenuItem copyMenuItem;
private javax.swing.JMenuItem cutMenuItem;
private javax.swing.JMenuItem deleteMenuItem;
private javax.swing.JMenu editMenu;
private javax.swing.JMenuItem exitMenuItem;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenu helpMenu;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private java.awt.Label label1;
private java.awt.Label label2;
private java.awt.Label label3;
private javax.swing.JMenuBar menuBar;
private javax.swing.JMenuItem openMenuItem;
private javax.swing.JMenuItem pasteMenuItem;
private javax.swing.JMenuItem saveAsMenuItem;
private javax.swing.JMenuItem saveMenuItem;
         

}

Działają przyciski clear, exit, select tylko ten insert ...? Proszę uprzejmie o jakąś wskazówkę

0

Dziwnie zapytanie budujesz:

String sql = " INSERT INTO countries VALUES ('" + idx + "','" + country_name + "','" + region + "')";

        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);
            PreparedStatement cs = con.prepareStatement(sql);

            cs.setInt(1, idx);
            cs.setString(2, country_name);
            cs.setInt(3, region);

            cs.close();
            con.close();

Najpierw z palca dajesz wartości jako string, a potem jeszcze raz próbujesz dodać je przez preparedStatement.
Powinno być:
INSERT INTO countries VALUES (?,?,?)

0

Nie jestem pewien czy dobrze rozumiem 0 masz wszystkie dane w jednym TextArea, z kolumnami porozdzielanymi np. tabami i chcesz to porozbijać na części? Powinno wystarczyć użycie funkcji http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split%28java.lang.String%29 na wyniku .getText() z argumentem np. "[\t]" (nie jestem pewien jak dokładnie powinno wyglądać to wyrażenie regularne) czy np. http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/StringUtils.html#split%28java.lang.String,%20char%29 (ale to już wymaga dodatkowej biblioteki apache Commons Lang)

0

Najpierw z palca dajesz wartości jako string, a potem jeszcze raz próbujesz dodać je przez preparedStatement.
Powinno być:
INSERT INTO countries VALUES (?,?,?)</quote>

niom niestety nie działa. Pojawia się nowe okienko z komunikatem "Niepoprawny indeks kolumny".

0
ucho napisał(a)

Nie jestem pewien czy dobrze rozumiem 0 masz wszystkie dane w jednym TextArea, z kolumnami porozdzielanymi np. tabami i chcesz to porozbijać na części? Powinno wystarczyć użycie funkcji http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split%28java.lang.String%29 na wyniku .getText() z argumentem np. "[\t]" (nie jestem pewien jak dokładnie powinno wyglądać to wyrażenie regularne)

mam 3 pola:

jTextField1,
jTextField2,
jTextField3

i te wpisane dane do tych pól, chce dodać do bazy danych , za pomocą przycisku.

0
kasiaKasia napisał(a)

Najpierw z palca dajesz wartości jako string, a potem jeszcze raz próbujesz dodać je przez preparedStatement.
Powinno być:
INSERT INTO countries VALUES (?,?,?)

niom niestety nie działa. Pojawia się nowe okienko z komunikatem "Niepoprawny indeks kolumny".</quote>

Teraz mam tak:
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

    int idx = Integer.parseInt(jTextField1.getText());
    String country_name = jTextField2.getText();
    int region = Integer.parseInt(jTextField3.getText());
    String driver = "oracle.jdbc.driver.OracleDriver";
    String serverName = "localhost";
    String portNumber = "1521";
    String sid = "XE";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    String pass = "ola";
    String user = "ola";
    String sql = "INSERT INTO countries VALUES (?,?,?);";


    try {
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, user, pass);
        PreparedStatement cs = con.prepareStatement(sql);

        cs.setInt(1, idx);
        cs.setString(2, country_name);
        cs.setInt(3, region);

        cs.close();
        con.close();

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());

    }

}     

i jak naciskam przycisk to cały czas jest runing. Nie wyświetlają się żadne błędy. Sprawdzam w Oracle nic nie dodaje . Dziwne...?

0

@kasiaKasia, a czy przed cs.close(); wywołałaś executeUpdate()....

0
Koziołek napisał(a)

@kasiaKasia, a czy przed cs.close(); wywołałaś executeUpdate()....

jak dodałam tak :

String sql = "INSERT INTO countries VALUES (?,?,?);";
try {
Class.forName(driver);
Connection con = DriverManager.getConnection(url, user, pass);
PreparedStatement cs = con.prepareStatement(sql);

        cs.setInt(1, idx);
        cs.setString(2, country_name);
        cs.setInt(3, region);
        
        cs.executeUpdate();
        
        cs.close();
        con.close();

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
    }

to otwiera mi sie okienko z błędem "ORA-00911: invalid character "

a jak usunęłam ; z zapytania
String sql = "INSERT INTO countries VALUES (?,?,?)";

to mam okienko z błędem "ORA-00001 unique constraint (OLA.SYS_C004613) violated"

tak powinno odbyć się dodanie
cs.executeUpdate();

jak zrobiłam powyżej...?

0

@kasiaKasia, masz już taki rekord w bazie i jest konflikt klucza.

0
Koziołek napisał(a)

@kasiaKasia, masz już taki rekord w bazie i jest konflikt klucza.

Przepraszam , już działa :) DZIĘKUJE ZA POMOC :)

Tak masz racje wprowadziłam dane które są już w BD.

a to kod jak ktoś by potrzebował:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

    int idx = Integer.parseInt(jTextField1.getText());
    String country_name = jTextField2.getText();
    int region = Integer.parseInt(jTextField3.getText());
    String driver = "oracle.jdbc.driver.OracleDriver";
    String serverName = "localhost";
    String portNumber = "1521";
    String sid = "XE";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    String pass = "ola";
    String user = "ola";
    String sql = "INSERT INTO countries VALUES (?,?,?)";
    try {
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, user, pass);
        PreparedStatement cs = con.prepareStatement(sql);

        cs.setInt(1, idx);
        cs.setString(2, country_name);
        cs.setInt(3, region);

        cs.executeUpdate();

        cs.close();
        con.close();

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1