Dodawanie danych do tabeli.

0

Witam. Mam bazę danych, w której jest tabela samoloty:

create table samoloty (
  id_samolotu number(6,0) constraint samoloty_pk primary key,
  nazwa varchar2(20),
  typ varchar2(20),
  pojemnosc number(6,0)
); 

I chcę w programie napisanym w Javie dodać wpis do bazy. W programie mam menu i wybieram przycisk dodaj samolot i wyskakuje mi jFrame z trzema jTextami do wprowadzenia nazwy, typu i pojemności. Napisałem coś takiego do dodania tych danych:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        String sql = " INSERT INTO samoloty VALUES (?,?,?,?)";
        String server = "localhost";
        int port = 1521;
        String database = "XE";
        String login = "HR";
        String password = "asdfghj";
        int p;

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String connectionString = "jdbc:oracle:thin:@" + server + ":" + port + ":" + "XE";
            Connection con = DriverManager.getConnection(connectionString, login, password);
            PreparedStatement cs = null;
            p = Integer.parseInt(jTextField3.getText());

            cs.setInt(1, 0);
            cs.setString(2, jTextField1.getText());
            cs.setString(3, jTextField2.getText());
            cs.setInt(4, p);

            cs.executeUpdate();
            cs.close();
            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    } 

Jednak po wypełnieniu pól i kliknięciu dodaj powyższa metoda wywala błąd: NULLPointerException.
Mam pytanie czy powyższa metoda jest dobra? Powinna mi dodać wpisy do tabeli?
Czy jeśli w tabeli mam np. zmienne typu number a jText przyjmuje Stringi to muszę tak jak powyżej

 p = Integer.parseInt(jTextField3.getText()); 

konwertować typ String na int aby do tabeli wprowadzić daną za number?

1
int id = Integer.parseInt(jTextField1.getText());
        int employess_id = Integer.parseInt(jTextField2.getText());
        // String departments_id= String.valueOf(jComboBox1.getSelectedItem());

        String departments_name = String.valueOf(jComboBox1.getSelectedItem());

        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 = "xxx";
        String user = "xxx";
        String sql = "INSERT INTO time_work(id, employess_id, departments_name) VALUES (?,?,?)";

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

            cs.setInt(1, id);
            cs.setInt(2, employess_id);
            cs.setString(3, departments_name);

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

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

ten przykład powinien pomoc

0

Mam jeszcze pytanie. Dodam sobie np. wpis w tabeli o id 1. A potem usunę go przez SQL Developer z tabeli za pomocą delete from samoloty. To potem gdy wywołam select *from samoloty tabela faktycznie jest pusta. Jednak gdy znów odpalę program i chcę dodać wpis o id 1 to program się zawiesza i nic nie robi. Pomaga dopiero usunięcie tabeli drop table samoloty i utworzenie jej znowu za pomocą create.

0

String sql = "INSERT INTO time_work(employess_id, departments_name) VALUES (?,?)";

        cs.setInt(1, employess_id);
        cs.setString(2, departments_name);

Id - doda się automagicznie.

0

Zmieniłem na takie coś:

String sql = " INSERT INTO samoloty(nazwa, typ, pojemnosc) VALUES (?,?,?)";
int p = Integer.parseInt(jTextField3.getText());

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String connectionString = "jdbc:oracle:thin:@" + server + ":" + port + ":" + database;
            Connection con = DriverManager.getConnection(connectionString, login, password);
            PreparedStatement cs = con.prepareStatement(sql);

            cs.setString(1, jTextField1.getText());
            cs.setString(2, jTextField2.getText());
            cs.setInt(3, p);
            JOptionPane.showMessageDialog(null, "Wpis został dodany");
            cs.executeUpdate();
            cs.close();
            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        } 

Niestety wywala błąd: cannon insert NULL into (HR, samoloty ID_Samolotu).
Czyli jednak nie dodaje się samo.;/

0

Spróbowałem dodać sekwencje do tabeli, ale nie chce utworzyć tabeli, gdzie zrobiłem błąd?

create sequence id_sam;
create table samoloty (
  id_samolotu number(6,0) default nextval('id_sam') constraint samoloty_pk primary key,
  nazwa varchar2(20),
  typ varchar2(20),
  pojemnosc number(6,0)
); 
1
CREATE SEQUENCE SEQUENCE_
START WITH 1
INCREMENT BY 1;
 DROP SEQUENCE xxxx.SEQUENCE_

DROP TRIGGER SEQUENCE_trigger

CREATE OR REPLACE TRIGGER SEQUENCE_trigger
BEFORE INSERT
ON nazwa_tab
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT SEQUENCE_.nextval INTO :NEW.id FROM dual;
END;
/
show err

może to pomoże

0

Nie będę zakładał nowego tematu, ale teraz mam problem z usunięciem. Mam tabele jTable, która mi wyświetla wszystkie dane znajdujące się w bazię i chcę usunąć jeden wiersz z tej tabeli. Chciałem to zrobić tak, że zaznaczamy kursorem wiersz w tej tabeli i klikamy przycisk usuń. Napisałem coś takiego:

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
        jTable1.getSelectedRow();
        String server = "localhost";
        int port = 1521;
        String database = "XE";
        String login = "HR";
        String password = "asdfghj";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String connectionString = "jdbc:oracle:thin:@" + server + ":" + port + ":" + database;
            Connection con = DriverManager.getConnection(connectionString, login, password);
            Statement cs = con.createStatement(
                ResultSet.TYPE_FORWARD_ONLY,
                ResultSet.CONCUR_UPDATABLE);

            ResultSet dane = cs.executeQuery("Select * from samoloty");

            if (dane.getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
                System.out.println("ResultSet non-updatable.");
            } else {
                System.out.println("ResultSet updatable.");
            }
            dane.moveToCurrentRow();
            dane.deleteRow();
            cs.close();
            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    } 

Jednak nie chce mi usunąć i dostaję: ResultSet non-updatable. Co zrobić aby usunąć ten wiersz?

1

przykład :

Class.forName(driver);
Connection con = DriverManager.getConnection(url, user, pass);
String dane = "DELETE FROM samoloty WHERE id = ?"; 

DELETE = con.prepareStatement(dane);

DELETE.setInt(1, id);
DELETE.executeUpdate();

DELETE.close();

warto sobie utworzyć klasę za pomocą której będziesz wywoływał obiekt połączenia.

0
String dane = cs.executeQuery("DELETE FROM samoloty WHERE id = ?"); 

Nie może być typu String. Zgłasza mi, że ma być ResultSet.

Poza tym mój kod jest wzorowany na tym: http://www.roseindia.net/tuto[...]t/jdbcresultsetdeleterow.html
Wydaje mi się, że powinno działać.

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