簡體   English   中英

Java應用程序的SQL數據庫中結果集錯誤的列數

[英]Number of columns for result set error in SQL database for Java app

我在通過Netbeans上的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'. The column position '1' is out of range. The number of columns for this ResultSet is '0'.

在數據庫中,Serial為VARCHAR(5) ,Bladetype為VARCHAR(80) ,StartT1為VARCHAR(12)

startTime1變量以HH:mm:ss.SSS格式保存。

數據庫結構

感謝您對此錯誤的任何幫助

您需要在查詢中提供占位符。 更改您的代碼,如下所示...

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();

使用Prepared語句時,無需在查詢中提供列名。 進行以下更改:

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

希望能幫助到你!!

在這里,您將形成簡單語句之類的查詢,並在不可能的預准備語句中使用它,因此請使用如下所示的占位符更改查詢。

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();

如果要直接使用bladeSerial類的變量名稱,則應使用這些String變量,就像要添加多個String一樣。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM