2017-06-11 53 views
-2

我是新手編程,我找不出如何解決此錯誤:java.sql.SQLEception :參數索引超出範圍(1>參數數量,即0)。第一個JFrame運行,我得到它連接到數據庫的消息,但彈出錯誤,並且沒有任何內容保存到我的數據庫中。 這裏是我的代碼:?錯誤java.sql.SQLEception:參數索引超出範圍(1>參數數量,它是0)

import java.sql.*; 
import javax.swing.*; 

public class SaveData extends javax.swing.JFrame { 
Connection conn=null; 
PreparedStatement pst=null; 
ResultSet rs=null; 

public SaveData() { 
    initComponents(); 
}     

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {           
    conn=MySQLConnect.ConnectDB(); 
    String Sql="Select * from TripData"; 
    try{ 
     pst=conn.prepareStatement(Sql); 
     pst.setString(1, txtTripDate.getText()); 
     pst.setString(2, txtStartDest.getText()); 
     pst.setString(3, txtEndDest.getText()); 
     pst.setString(4, txtMileage.getText()); 
     pst.setString(5, txtCost.getText()); 
     if(rs.next()){ 
      JOptionPane.showMessageDialog(null, "Trip Saved"); 
      InfoSaved s=new InfoSaved(); 
      s.setVisible(true); 
     } 
     else{ 
      JOptionPane.showMessageDialog(null, "Invalid Information", 
"Please enter again", JOptionPane.ERROR_MESSAGE); 

     } 
    }catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e);  } 
}          
+0

這個例外表明,這個問題可以在命令行應用程序中複製,這意味着它與Swing沒有任何關係。提示:1)不要添加不相關的標籤。 2)在命令行應用程序中調試SQL部分。第一。 –

+0

如果要將某些內容保存到數據庫中,SELECT語句不會對您有所幫助。嘗試插入。 – Eran

+0

你在SQL中沒有參數標記('?'),所以你認爲'setString(1,...)'會做什麼,爲什麼? ---另外,如果代碼可以得到那麼多,'rs.next()'將會失敗並返回'NullPointerException'。 ---最後,你認爲'SELECT' SQL語句的作用是什麼,爲什麼? *提示:*它不會*保存*到數據庫。 – Andreas

回答

0

SQL字符串必須包含-placeholder每個參數要設置。

0

我想你想要做這樣的事情[它的工作原理,如果PST是一個聲明】:

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {           
     conn=MySQLConnect.ConnectDB(); 
     String Sql="Select * from TripData"; 
     try{ 
      pst = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
      rs = pst.executeQuery(Sql); // Gets all the TripData rows 
      rs.moveToInsertRow();  // Moves to "insert" row 
      // Updates "insert" row columns 
      rs.updateString("colum_name", txtTripDate.getText()); 
      rs.updateString("colum_name", txtStartDest.getText()); 
      rs.updateString("colum_name", txtEndDest.getText()); 
      rs.updateString("colum_name", txtMileage.getText()); 
      rs.updateString("colum_name", txtCost.getText()); 
      rs.insertRow(); // Inserts the "insert" row to your database 
      if(rs.rowInserted()){ 
       JOptionPane.showMessageDialog(null, "Trip Saved"); 
       InfoSaved s=new InfoSaved(); 
       s.setVisible(true); 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "Invalid Information", "Please enter again", JOptionPane.ERROR_MESSAGE); 
     } 
     }catch(Exception e){ 
      JOptionPane.showMessageDialog(null, e);  
     } 
    } 

編輯: [代碼爲PST作爲一個PreparedStatement]
你必須改變你的查詢,你不能通過SELECT命令來INSERT(如果這是你想要做的)。

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {           
    conn=MySQLConnect.ConnectDB(); 
    String Sql="INSERT INTO TripData(COLUMN_NAME, COLUMN_NAME, COLUMN_NAME, COLUMN_NAME, COLUMN_NAME) VALUES(?, ?, ?, ?, ?)"; 
    try{ 
     pst = conn.prepareStatement(Sql); 
     pst.setString(1, txtTripDate.getText()); 
     pst.setString(2, txtStartDest.getText()); 
     pst.setString(3, txtEndDest.getText()); 
     pst.setString(4, txtMileage.getText()); 
     pst.setString(5, txtCost.getText()); 
     int affectedRows = pst.executeUpdate(); 
     if(affectedRows != 0){ 
      JOptionPane.showMessageDialog(null, "Trip Saved"); 
      InfoSaved s=new InfoSaved(); 
      s.setVisible(true); 
     } 
     else{ 
      JOptionPane.showMessageDialog(null, "Invalid Information", "Please enter again", JOptionPane.ERROR_MESSAGE); 
    } 
    }catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e);  
    } 
} 

對不起,我的錯誤。

+0

謝謝,我現在看到一些錯誤。我試過這段代碼,現在我得到一個錯誤:java.lang.RuntimeException:不兼容的源代碼 - 不兼容的類型:java.sql.Statement無法轉換爲java.sql.PreparedStatement。 – Hayley

+0

Ups,我忘記了您正在使用Prepared Statement,抱歉。此代碼適用於Statement實例。我在編輯我的答案。 – Lydzje

相關問題