2016-03-29 3 views
2

Я работаю над приложением Airsoft.Как добавить записи в databse через sql в Java

Я пытаюсь добавить записи в базу данных MS Access через SQL в Java. Я установил ссылку на базу данных со следующим:

try 
    { 
     //String Driver = "sun.java.odbc.JdbcOdbcDriver"; 

     Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); 

     Connection conn = DriverManager.getConnection("jdbc:ucanaccess://" + URL,"",""); 

     Statement stmt = conn.createStatement(); 

     System.out.println("Connection Established!"); 

     ResultSet rs = stmt.executeQuery("SELECT * FROM AirsoftGunRentals"); 
     tblRent.setModel(DbUtils.resultSetToTableModel(rs)); 


    } 
    catch(Exception ex) 
    { 
     JOptionPane.showMessageDialog(null, "Error"); 
    } 

Я использую Ucanaccess для доступа к моей базе данных MS. Он считывает базу данных и отображает JTable. Однако мне нужно создать три JButtons для добавления, удаления и обновления таблицы. Я попытался закодировать кнопку добавления, и я попытался добавить запись, но он сбой и дает мне ошибки.

try 
    { 
     //String Driver = "sun.java.odbc.JdbcOdbcDriver"; 
     Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); 
     Connection conn = DriverManager.getConnection("jdbc:ucanaccess://" + URL,"",""); 

     Statement stmt = conn.createStatement(); 

     System.out.println("Connection Established!"); 

     String Query= "INSERT INTO AirsoftGunRentals(NameOfGun, Brand, TypeOfGuns, NumberOfMagazines,Extras,NumberAvailable,UnitRent)"+ 
      "VALUES('"+pName+"','"+pBrand+"','"+pTypeOfGun+"','"+pNumMags+"','"+pExtras+"','"+pNumberAvail+"','"+pRent+"');"; 

     ResultSet rs = stmt.executeQuery(Query); 

     JOptionPane.showMessageDialog(null, "Success!"); 


    } 
    catch(Exception ex) 
    { 
     JOptionPane.showMessageDialog(null, "Error"); 
    } 

Я попытался все три, надеясь на результат. Но я все еще получаю большие ошибки. Единственная разница между кнопками заключается в том, что один добавляет, один удаляет и один обновляет таблицу. Другое, тогда, код тот же, минус переменные.

+3

Какие ошибки? Опубликовать полную трассировку стека исключений. И используйте подготовленные заявления. (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html) –

ответ

0

Мне удалось найти ответ о том, как добавлять, удалять и обновлять записи в MS Access DB. Это то, что я нашел, после того, как я объявил соединение, и подготовленное заявление. Я постараюсь объяснить все, что могу. Я должен добавить значения по отдельности с помощью этого:

(pstmt = Variable нацелен Заявление)

pstmt.setWhatever (1, переменная);

И он отлично работает сейчас. Я использую тот же метод для удаления и обновления записей.

Это базовый формат запроса:

Строка SQLInsert = "INSERT INTO TBL VALUES (NULL,,,,,???)";

NULL в заявлении является номером autonumber в таблице. и .setWhatever() заменяет вопросительные знаки на типы данных. Таким образом, манипулирование базой данных.

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

0

Сначала добавьте пробел перед кавычками, как это:

 String Query= "INSERT INTO AirsoftGunRentals(NameOfGun, Brand, TypeOfGuns, NumberOfMagazines,Extras,NumberAvailable,UnitRent) "+ 
     " VALUES('"+pName+"','"+pBrand+"','"+pTypeOfGun+"','"+pNumMags+"','"+pExtras+"','"+pNumberAvail+"','"+pRent+"');"; 

И использовать stmt.executeUpdate(Query); вместо: stmt.executeQuery(Query); в вашей вставки, обновления и удаления запросов. Для избранных запросов вы можете сохранить их.

+0

Ах. Я вижу сейчас. Таким образом, пробелы между оператором будут читать его как простой оператор SQL? По иронии судьбы, я тоже получил этот код из стека. – GipsyD

1

Как упоминал Брахим, вы должны использовать stmt.executeUpdate(Query) всякий раз, когда вы обновляете/вставляете или удаляете данные. Также с этим конкретным запросом, учитывая вашу конкатенацию String (см. Конец строки), между «)» и «VALUES» нет пробела, которое, вероятно, вызывает искаженный запрос.

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

  • Использование PreparedStatement вместо Statement и заменить переменные заполнителями для предотвращения внедрения SQL. Код, который вы используете здесь, чрезвычайно подвержен внедрению SQL - если какой-либо пользователь имеет какой-либо контроль над любой из переменных, это может привести к полной дампе базы данных (краже), уничтожению данных (вандализм) или даже к машинам если другие условия выполнены. Хороший совет - никогда не использовать класс Statement, лучше быть в безопасности, чем извините :)
  • Уважение Java-соглашений (или быть последовательным). В вашем примере вы определяете String Query, а все остальные переменные начинаются с нижнего регистра (как в Java-соглашениях), а не String query. Сверхурочные, такие небольшие ошибки (которые не сломают сборку) приведут к ошибкам из-за ошибочных переменных с классными именами и т. Д. :)

Удачи вам на пути к освоению этого замечательного языка! :)

+0

Это на самом деле школьный проект, и мы должны использовать его только один раз. КОГДА-ЛИБО! Быстро, если вы используете предложение executeUpdate(), вам нужен набор результатов для его сброса? Или это отдельная линия? Спасибо вам за помощь. Теперь он дает более открытое представление о задаче. – GipsyD

+0

Что касается возвращаемого значения предложения executeUpdate(), то в качестве состояний Javadoc возвращается целое число: '(1) количество строк для операторов SQL Data Manipulation Language (DML) или (2) 0 для операторов SQL, возвращающихся ничего ' Итак, если вы используете executeUpdate() для обновления 42 строк, оно вернет 42 – niilzon

+0

Что касается SQL-инъекции, я рекомендую вам привычно правильно кодировать код для обеспечения качества и безопасного кода :) Кроме того, некоторые из ваших одноклассников, вероятно, сделали ту же ошибку - было бы интересно продемонстрировать инъекцию (в доброжелательном/доброкачественном режиме) в классе :) Безопасность - большой вопрос, и будет еще больше с подавляющим присутствием кода работая повсюду в нашей повседневной жизни, это хороший пример для повышения осведомленности среди ваших одноклассников. Я позволю вам подумать об этом :) – niilzon

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

  • Нет связанных вопросов^_^