2013-12-16 4 views
0

У меня возникли проблемы с упражнением я работаю с Java с использованием базы данных Access, интересно, если кто-то может пролить некоторый свет на этотВставка данных в базу данных Access

В моем главном классе я сделать вызов, как это

Product p = new Product("test", "Test Product", 49.50); 
insertProduct(p); 

Это вызывает insertProduct (p); метод. То, что я пытаюсь сделать, это вставить некоторые тестовые данные в базу данных, вот мой код для этого.

public static void insertProduct(Product p) 
{ 
    try 
    { 
     System.out.println("Insert test: "); 

     String insertProduct = "INSERT INTO Products (ProductCode, Description, Price) VALUES ('andr', 'Beginning Android', '38.99')"; 
     PreparedStatement ps = connection.prepareStatement(insertProduct); 
     ps.setString(1, p.getCode()); 
     ps.setString(2, p.getDescription()); 
     ps.setDouble(3, p.getPrice()); 
     ps.executeUpdate(); 

     ResultSet rs = ps.executeQuery(); 

     rs.next(); 
     String productCode = rs.getString(1); 
     String description = rs.getString(2); 
     double price = rs.getDouble(3); 

     p = new Product(productCode, description, price); 


     printProduct(p); 
     System.out.println(); 

    } 
    catch(SQLException e) 
    { 
     e.printStackTrace(); 
    } 
} 

, когда я запускаю это я получаю

Исключение в потоке «главный» java.lang.NullPointerException

и не может понять, что происходит, я знаю, что, когда я запускаю отладчик и выполняю этот метод, он сбрасывает в начале этого отчета

ps.setString(1, p.getCode()); 
ps.setString(2, p.getDescription()); 
ps.setDouble(3, p.getPrice()); 
ps.executeUpdate(); 

здесь результаты трассировки стека

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(JdbcOdbcPreparedStatement.java:1023) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(JdbcOdbcPreparedStatement.java:3057) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(JdbcOdbcPreparedStatement.java:766) 
at DBTesterApp.insertProduct(DBTesterApp.java:165) 
at DBTesterApp.main(DBTesterApp.java:21) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
+0

Что трассировки стека вашего исключения? Является ли 'p' или' ps' null? – pamphlet

+0

Другая возможность заключается в том, что p.getCode() или p.getDescription() или p.getPrice() возвращают null. (эти значения также не используются в SQL) – NickJ

+0

«Это результаты трассировки стека»: я не вижу его – NickJ

ответ

2

Строка в трассировки стека:

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(JdbcOdbcPreparedStatement.java:766) 

указывает, что он упал во время вызова PreparedStatement.setString(), что свидетельствует о том, что либо р .getCode() или p.getDescription() возвращает значение null.

Поэтому в вашем классе продукта есть проблема. Правильно ли задаете эти поля в конструкторе?

Как только вы исправили это, вы можете быть разочарованы тем, что все ваши строки, которые вы вставляете, имеют точно такие же данные.

Посмотрите вы SQL, чтобы выяснить, почему:

String insertProduct = "INSERT INTO Products (ProductCode, Description, Price) VALUES ('andr', 'Beginning Android', '38.99')"; 

Это должно быть:

String insertProduct = "INSERT INTO Products (ProductCode, Description, Price) VALUES (?,?,?)"; 
+0

Хорошо сказал, NickJ. – pamphlet

+0

Спасибо, ребята, я понял это. База данных, которую я использовал, была только для чтения, мне пришлось настроить доступ на запись к базе данных, когда я это сделал, она работала нормально. –

Смежные вопросы