2011-01-03 2 views
0

Insert, Update and Delete을 MS Access의 테이블에서 처리하려고합니다. 모든 것이 잘 작동합니다.삽입시 Java 일반 오류 ... ???

SELECT 성명. 그러나 다른 세 가지 작업을 수행 할 때 나는 아무 것도 얻지 못하는 것 같습니다

오류가 있지만 DB에 작업이 반영되지 않습니다. 도와주세요 ...

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

@El Classico : 내 게시물을 편집하여 예외를 해결할 수 있도록 도와주세요. – LaGrandMere

+0

@LaGrandMere : 기본 키를 제거했습니다 .. 완전히 다른 값을 삽입하려고 시도했습니다 ... 업데이트 ...하지만 내 DB에 반영되지 않습니다 ..하지만 그 후에 SELECT를 수행하면 값이 표시됩니다. DB에없는 것, 즉 업데이트 된 것 ... –

+0

준비된 성명서에 필드 이름을 포함시키기 위해 자신과 LaGrandMere의 게시물에서 제안을 시도해 보셨습니까? –

답변

3

연결이 commit/close이 아닌 경우이 오류가 발생할 수 있습니다. 문을 실행 한 후에 연결을 커밋하고 연결이 완료되고 실행 된 블록의 finally 블록에서 연결 (및 문 및 결과 집합)을 닫아야합니다. PreparedStatement를 사용하는 이유에

, 그것은 SQL injectionattacks을 피하고 자바 String로 변환 할 필요없이 SQL 쿼리에 Date, InputStream 등과 같은 객체 fullworthy 설정을 완화하는 일반적인 방법입니다.

+0

고맙습니다 .. BalusC .. 내가 다시 시도하고 알려 드리겠습니다 ... –

+0

이것은 나를 위해 일했습니다! 고마워. –

0

PreparedStatement를 사용하는 주된 이유는 보안입니다. 가변 부분에는 사용자가 입력 한 SQL 문이 포함될 수 있으므로 문자열을 연결하여 SQL 쿼리를 생성하는 것은 안전하지 않습니다. 이렇게하면 사용자에게 DROP TABLE *과 같은 명령문을 실행할 수 있습니다 (SQL Injection 참조). Theres는 SQL 쿼리가 정적이지 않은 경우에만 PreparedStatemnts를 사용하는 것이 좋습니다 (doe snot에 가변 부분 포함). 따라서 SELECT 문에 PreparedStatement를 사용하는 것이 좋습니다.

1

귀하의 준비된 진술 형식이 잘못된 것 같습니다. (여기에 해당 : http://msdn.microsoft.com/en-us/library/bb208861(v=office.12).aspx) INSERT INTO에 대한 설명서 :

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

Single-record append query:

당신은 형식 줄이 형식을 제공

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

편집 : 난 당신이 뭔가를 할 생각 더 명확하게하려면 :

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

여기서 연도, 이름, 입력란 3 ...은 삽입하려는 필드

0

편집 : 그것이 ID 열이 있다면

당신은 당신의 학생 기본 키를 삽입하려고, 그것은 작동하지 않습니다.

는이처럼 문을 준비해야합니다

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

당신의 기본 키 설정없이, DB는 당신을 위해 그것을 할 것입니다.

.

.

.

원본 게시물 :

kind of similar question on StackOverflow 있습니다.

연결을 제대로 닫을 때까지 Access에서 INSERT 쿼리 결과가 표시되지 않습니다.

코드가 리소스를 닫지 않아 슬픔을 가져올 수 있습니다. finally 블록에 close 메소드를 호출하십시오 (둘 이상인 경우 역순으로).

다음은 필요한 경우 도움을주는 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

원래 질문자가 PK 값과 관련하여 실제로 필요로하는 것이 무엇인지 모르지만 Jet/ACE Autonumber 필드는 값이 올바른 데이터 유형이고 기존 값과 충돌하지 않는 한 값을 삽입 할 수 있습니다. –