Исключение в базе данных - PullRequest
0 голосов
/ 09 января 2010

HI

Я сделал метод в своем классе:

public void addInfo(String username, String password, String name, String family) {
        try {

 String sql = "INSERT INTO user VALUES (?, ?, ?, ?)";
            PreparedStatement pst = conn.prepareCall(sql);
            pst.setString(1, username);
            pst.setString(2, password);
            pst.setString(3, name);
            pst.setString(4, family);
            int nRecords = pst.executeUpdate();
            logger.info("User Added Successfully...");
        } catch (SQLException ex) {
            logger.info("ERROR in adding user");

            ex.printStackTrace();
        }
    }

А потом я получаю это в своем классе addInfo:

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

        String name = NameField.getText().trim();
        String family = FamilyField.getText().trim();
        String username_signup = UsernameSignUp.getText().trim();
        String password = new String(PasswordSignUp.getPassword()).trim();

        if ((name == null ? "" == null : name.equals("")) || (family == null ? "" == null : family.equals("")) || (username_signup == null ? "" == null : username_signup.equals("")) || (password == null ? "" == null : password.equals(""))) {

            JOptionPane.showMessageDialog(this, "Fill the blanks...", "WARNING", JOptionPane.WARNING_MESSAGE);
            clearAll();
            NameField.grabFocus();
            return;

        } else {

            UserManager um = new UserManager();
            um.addInfo(username_signup, password, name, family);

            FirstPage fp = new FirstPage();
            this.setVisible(false);
            fp.setVisible(true);
        }
    }

Но я сталкиваюсь с этими исключениями:

run:
Jan 9, 2010 3:54:20 PM DBManager.UserManager addInfo
INFO: ERROR in adding user
java.sql.SQLException: Unable to retrieve metadata for procedure.
        at com.mysql.jdbc.CallableStatement.extractProcedureName(CallableStatement.java:1076)
        at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:1026)
        at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:83)
        at com.mysql.jdbc.Connection.prepareCall(Connection.java:1204)
        at com.mysql.jdbc.Connection.prepareCall(Connection.java:1181) 

Ответы [ 4 ]

2 голосов
/ 09 января 2010

conn.prepareCall(sql) следует использовать только для вызова хранимых процедур, а не для необработанного SQL.

Замените prepareCall на prepareStatement, и все будет в порядке.

1 голос
/ 09 января 2010

Еще один момент: вы вообще не очищаете ресурсы. У вас есть PreparedStatement, который подходит для GC, когда вы выходите из блока, но вы его нигде не закрываете. Закройте его в блоке finally с помощью статического метода, который не вызывает исключение:

public void insert(Connection connection)
{
    PreparedStatement ps = null;
    try
    {   
        // SQL stuff here.
    }
    finally
    {
        close(ps);
    }
}

public static void close(Statement s)
{
    try
    {  
        if (s != null)
        {
            s.close();
        }
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }
}

То же самое относится и к Connection и ResultSet.

Никакой транзакционной логики для вас тоже нет. Обычно вы хотите откатить операции записи в случае сбоя.

1 голос
/ 09 января 2010

Ошибка в prepareCall. Используется только для хранимых процедур. Вы должны использовать prepareStatement вместо.

1 голос
/ 09 января 2010

Вам необходимо использовать prepareStatement () . prepareCall () используется для вызова хранимых процедур.

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