2016-09-27 6 views
0

Netbeans上のJavaを使用してSQLデータベースにデータを追加する際に問題が発生しました。Javaアプリケーション用SQLデータベースの結果セットエラーの列数

String bladeSerial; 
String bladeType; 
LocalTime startTime1; 

private void startButton2ActionPerformed(java.awt.event.ActionEvent evt) {            

    Connection conn = null; 
    Statement st = null; 
    try { 
     conn = DriverManager.getConnection ("jdbc:derby://localhost:1527/db01", "Administrator", "admin"); //run procedure getConnection to connect to the database - see below 
     st = conn.createStatement(); //set up a statement st to enable you to send SQL statements to the database. 
    } catch (SQLException ex) { 
     Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    System.out.println ("Successful Connection"); 


    String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1) values ('+bladeSerial+', '+itemText+', '+(String.valueOf(startTime1))+')"; 
    try (PreparedStatement pstmt = conn.prepareStatement(query)) { 
     pstmt.setString(1, bladeSerial); 
     pstmt.setString(2, bladeType); 
     pstmt.setString(3, String.valueOf(startTime1)); 
     pstmt.executeUpdate(); 
    } catch (SQLException ex) { 
     Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
    } 

私は、データベース内のThe column position '1' is out of range. The number of columns for this ResultSet is '0'.

エラーを取得し、シリアルがVARCHAR(5)で、BladetypeはVARCHAR(80)あるとStartT1はstartTime1変数がフォーマットHHに保存されているVARCHAR(12)

です:MM:SS.SSS 。

The database structure

私はあなたのクエリにプレースホルダを与える必要があり、このエラー

+2

準備文がどのように機能するか分かりません。クエリは 'TB01(SERIAL、BLADETYPE、STARTT1)の値(?、?、?)に挿入する'でなければなりません。疑問符はパラメータのプレースホルダです。クエリのパラメータ値を連結すると目的が完全に無効になります。 –

答えて

1

上の任意の助けに感謝。ここに与えられたとして、あなたはプリペアドステートメントを使用している場合、クエリで列名を与える必要はありません

String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1) values (?, ?, ?)"; 
PreparedStatement pstmt = conn.prepareStatement(query); 
pstmt.setString(1, bladeSerial); 
pstmt.setString(2, bladeType); 
pstmt.setString(3, String.valueOf(startTime1)); 
pstmt.executeUpdate(); 
0

...あなたのコードを変更します。次の変更を行います。

String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1) values (?, ?, ?)"; 

希望します!

0

ここでは、単純な文のようなクエリを作成し、それを使用することはできないため、以下のようにプレースホルダでクエリを変更します。

String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1) values (?, ?, ?)"; 
PreparedStatement pstmt = conn.prepareStatement(query); 
pstmt.setString(1, bladeSerial); 
pstmt.setString(2, bladeType); 
pstmt.setString(3, String.valueOf(startTime1)); 
pstmt.executeUpdate(); 
0

あなたが直接bladeSerialのような変数名を使用する場合は、複数の文字列を追加しているかのように、あなたはこれらの文字列変数を使用する必要があります。それは深刻なセキュリティ上の問題を導入するよう

String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1) values ("+bladeSerial+", "+itemText+", "+(String.valueOf(startTime1))+")"; 

しかし、これは厳密にはお勧めしません。

PreparedStatementを使用することをお勧めします。あなたが書いた質問は正しいです。それは、変数名の代わりにプレースホルダを使用するだけです。

String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1) values (?, ?, ?)"; 
try (PreparedStatement pstmt = conn.prepareStatement(query)) { 
    pstmt.setString(1, bladeSerial); 
    pstmt.setString(2, bladeType); 
    pstmt.setString(3, String.valueOf(startTime1)); 
    pstmt.executeUpdate(); 
} catch (SQLException ex) { 
    // Exception handling 
    Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
}