Johanna
Johanna

Reputation: 27640

Exception in Database

HI

I made a method in my class that is:

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();
        }
    }

And then I retrieve this in my addInfo class:

 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);
        }
    }

But I face with these exceptions:

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) 

Upvotes: 0

Views: 1784

Answers (4)

duffymo
duffymo

Reputation: 308858

Just one more point: you aren't cleaning up resources at all. You've got a PreparedStatement that's eligible for GC when you exit the block, but you don't close it anywhere. Close it in a finally block using a static method that doesn't throw an exception:

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();
    }
}

Same holds true for Connection and ResultSet.

No transactional logic for you, either. Usually you want to rollback write operations in the event of a failure.

Upvotes: 1

Valentin Rocher
Valentin Rocher

Reputation: 11669

The error is in prepareCall. It's only used for stored procedures. You should use prepareStatement instead.

Upvotes: 1

Brian Agnew
Brian Agnew

Reputation: 272337

You need to use prepareStatement(). prepareCall() is used for calling stored procedures.

Upvotes: 1

skaffman
skaffman

Reputation: 403521

conn.prepareCall(sql) should only be used for invoking stored procedures, not raw SQL.

Replace your prepareCall with prepareStatement, and you should be fine.

Upvotes: 2

Related Questions