Java общая ошибка при вставке ... ??? - PullRequest
0 голосов
/ 03 января 2011

Я пытаюсь сделать Insert, Update and Delete для таблицы в MS Access.Все отлично работает

для оператора SELECT.Но при выполнении трех других операций я не вижу никаких ошибок

, но эти действия не отражаются на БД.Пожалуйста, помогите ...

Оператор INSERT выглядит следующим образом:

PreparedStatement ps = con.prepareStatement("INSERT INTO Student VALUES (?, ?, ?, ?, ?, ?, ?, ?)");    
  ps.setInt(1,1);    
  ps.setString(2,"ish");    
  ps.setInt(3,100);    
  ps.setInt(4,100);    
  ps.setInt(5,100);    
  ps.setInt(6,300);
  ps.setInt(7,100);
  ps.setString(8,"A");     
  ps.executeUpdate();

Также могу ли я узнать, почему PreparedStatement используется, кроме оператора SELECT ...

Я получаю эту ошибку:

Exception in thread "main" java.sql.SQLException: General error
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6986)
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
        at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3149)
        at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedState
ment.java:216)
        at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPrepare
dStatement.java:138)
        at Student.main(Student.java:19)

Это мой код ...

    import java.sql.*;
    import java.io.*;

    class Student {
        public static void main(String args[]) throws SQLException, IOException,    ClassNotFoundException {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection("jdbc:odbc:Student","","");
            Statement st = con.createStatement();
            PreparedStatement ps = con.prepareStatement("INSERT INTO Student VALUES (?, ?, ?, ?, 
            ?, ?, ?, ?)");
            ps.setInt(1,1);
            ps.setString(2,"Girish");
            ps.setInt(3,100);
            ps.setInt(4,100);
            ps.setInt(5,100);
            ps.setInt(6,300);
            ps.setInt(7,100);
            ps.setString(8,"A"); 
            ps.executeUpdate();
            con.commit();
            con.close();
        }
    }

Ответы [ 4 ]

3 голосов
/ 03 января 2011

Это может произойти, когда вы не фиксируете / закрываете соединение.Убедитесь, что вы фиксируете соединение после выполнения оператора и закрываете соединение (и оператор, и набор результатов) в блоке finally блока try, где они получены и выполнены.

Какпочему используется PreparedStatement, это общий подход, позволяющий избежать SQL-инъекций атак и упростить установку полноценных объектов Java, таких как Date, InputStream и т. д. в SQLзапрос без необходимости конвертировать их в String.

1 голос
/ 03 января 2011

Я считаю, что ваше подготовленное заявление имеет неправильный формат. Документация для INSERT INTO (доступна здесь: http://msdn.microsoft.com/en-us/library/bb208861(v=office.12).aspx) дает этот формат:

Запрос на добавление одной записи:

INSERT INTO target [(field1[, field2[, …]])]     VALUES (value1[, value2[, …])

Вы даете формат:

INSERT INTO target VALUES (value1[, value2[, …])

редактирование: Чтобы быть более ясным, я считаю, что вы хотите что-то вроде:

PreparedStatement ps = con.prepareStatement("INSERT INTO Student (Year, Name, field3 ...) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");

Где Year, Name, field3 ... это имена полей, в которые вы пытаетесь вставить.

0 голосов
/ 03 января 2011

Редактировать:

Вы пытаетесь вставить свой первичный ключ учащегося, если это столбец Identity, он не будет работать.

Вам необходимо подготовить свое заявление следующим образомэто:

PreparedStatement ps = con.prepareStatement("INSERT INTO Student(Field1,Field2,Field3,Field4,Field5,Field6,Field7) VALUES (?, ?, ?, ?, ?, ?, ?)");

Без вашего набора первичного ключа, БД сделает это за вас.

.

.

.

Исходное сообщение:

Существует аналогичный вопрос в StackOverflow .

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

Ваш код не закрывает никакие ресурсы, что наверняка принесет вам горе.Вызвать методы close (в обратном порядке, если их больше одного) в блоке finally.

Вот класс DataBaseUtils, который поможет вам при необходимости.

public class DatabaseUtils
{
    public static Connection createConnection(String driver, String url, String username, String password) 
        throws ClassNotFoundException, SQLException
    {
        Class.forName(driver);

        return DriverManager.getConnection(url, username, password);
    }

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

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

    public static void close(ResultSet rs)
    {
        try
        {
            if (rs != null)
            {
                rs.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace(e);
        }
    }
}
0 голосов
/ 03 января 2011

Основной причиной использования PreparedStatement является безопасность.Генерирование SQL-запроса путем объединения строк небезопасно, поскольку переменные части могут содержать операторы SQL, введенные пользователем.Это позволило бы выполнять операторы типа DROP TABLE * для пользователя (см. SQL-инъекция ).Существует хорошая идея использовать PreparedStatemnts только в том случае, если SQL-запрос не является статическим (не содержит переменных частей).Поэтому было бы также лучше использовать PreparedStatement для операторов SELECT.

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