2015-09-20 54 views
0

我有一個問題與此功能java.sql.SQLException:參數索引超出範圍(1>參數數量,爲0)。

String القيمة=jTextField3.getText(); 
Connection conn=null; 
PreparedStatement pstmt=null; 
ResultSet rs=null; 
try{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cars","root","123456"); 
    pstmt=conn.prepareStatement("select القيمة from eradat WHERE DATE_FORMAT(التاريخ, \"%m-%Y\") = \"01-2015\";"); 
    pstmt.setString(1,القيمة); 
    rs=pstmt.executeQuery(); 
    while(rs.next()){ 
     jTextField3.setText(rs.getString("القيمة")); 
    } 
} 
catch(Exception e){ 
    JOptionPane.showMessageDialog(null, e); 
} 
finally{ 
    try{ 
     conn.close(); 
     pstmt.close(); 
     rs.close(); 
    } 
    catch(Exception e){ 

    } 
} 

我獲得錯誤消息:值java.sql.SQLException:參數索引超出範圍(1>參數的數量,這是0)。

+2

您的SQL沒有任何參數標記(''?),所以沒有參數,因此「參數的數量」爲0 – Andreas

+0

如果你總是從你的結果集中檢索'rs.getString(「القيمة」)',你不需要這個'pstmt.setString(1,القيمة)'行。 – learningloop

回答

0

您正試圖向查詢中添加一個參數,該參數不需要參數,只需從您的代碼中刪除pstmt.setString(1,القيمة);,以使PreparedStatement不會將任何參數綁定到您提供的查詢中。因此,在try catch塊的代碼應該是這樣的:

try{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cars","root","123456"); 
    pstmt=conn.prepareStatement("select القيمة from eradat WHERE DATE_FORMAT(التاريخ, \"%m-%Y\") = \"01-2015\";"); 
    rs=pstmt.executeQuery(); 
    while(rs.next()){ 
    jTextField3.setText(rs.getString("القيمة")); 
    } 
} 
catch(Exception e){ 
    JOptionPane.showMessageDialog(null, e); 
} 

如果您需要設置參數的查詢,那麼你需要在它使用一個佔位符標誌?,在這種情況下,你就可以在查詢中設置一個值。然後qiuery可能是這樣的:

select القيمة from eradat WHERE DATE_FORMAT(التاريخ, \"%m-%Y\") = \"?\"; 

,你可以設置爲where子句的值與

pstmt.setString(1,"01-2015"); 
0

您正在嘗試使用未在您的語句中定義準備語句設置的參數。所以,簡單地刪除/註釋以下行代碼:

pstmt.setString(1,القيمة); 
相關問題