2015-04-18 34 views
0

請告訴我如何解決代碼中的錯誤。我想從ms訪問表中獲取詳細信息。我已經將數據和描述用作列。日期是ms訪問中的主鍵。所以請讓我幫我讀取ms訪問表中的數據。如何在查詢表達式'date = 19apr2015'中刪除錯誤[Microsoft] [ODBC Microsoft Access Driver]語法錯誤(缺少運算符)。


try{ 
    connect();  
    stmt = (Statement) conn.createStatement(); 
    String sql, ks = " "; 
    ks = JOptionPane.showInputDialog("enter the date of which you want to read");  
    String jk = " where date=" + ks; 


    sql = "SELECT [date],[description] FROM Table2" + jk; 
    System.out.println("1"); 
    rs = ((java.sql.Statement) stmt).executeQuery(sql); 

    if(rs.next()) 
    { 
     String date1="hello",description1="hii"; 
     date1 = rs.getString("date"); 
     description1=rs.getString("description"); 
     JOptionPane.showMessageDialog(null,"Date:"+date1+"\n"+description1); 
    } 
    else 
    { 
     JOptionPane.showMessageDialog(null,"Sorry the record does not exist"); 
     try 
     { 
      close(); 
     } 
     catch(Exception ea) 
     { 
      JOptionPane.showMessageDialog(null, "Error:"+ea.getMessage()); 
     } 
    } 
} 
catch(Exception ew) 
{ 
    JOptionPane.showMessageDialog(null, "Unable to fetch Data"); 
    JOptionPane.showMessageDialog(null,""+ew.getMessage()); 
    System.out.println(""+ew); 
} 

感謝

+0

修復您的格式,我會告訴你錯誤的原因! ;) – isnot2bad

+0

什麼是格式化探針,它看起來不錯,我猜。 –

+0

_現在不錯。 – isnot2bad

回答

0

你的錯誤消息說,有一個在您的SQL查詢語法錯誤。在你的榜樣,它似乎是:

SELECT [date],[description] FROM Table2 where date=19apr2015. 

這是錯誤的日期(19apr2015)不具有正確的格式。

正確的SQL查詢將是:

SELECT [date],[description] FROM Table2 where date=#4/19/2015# 

所以,你將不得不解析用戶輸入,並將其轉換成正確的形式,或要求用戶輸入的正確形式的日期。

SQL注入

在這兩種情況下,它被勸使用PreparedStatement的日期作爲參數,而不是放在一起的SQL語句中使用字符串連接,因爲後者是因爲所謂的SQL injection一個邪惡的東西危險!例如,假設,用戶想要做任何傷害,而不是輸入一個有效的日期,他/她進入

#1/1/2000#; DELETE * FROM Table2 

所以下面的SQL語句將通過您的數據庫中執行:

SELECT [date],[description] FROM Table2 where date=#1/1/2000#; DELETE * FROM Table2 

第二個陳述將簡單地刪除您的所有數據! (確切地說,上面的語句會失敗,因爲MS Access不支持連鎖多個語句,但是其他數據庫系統確實支持這一點,所以這是一個安全漏洞,在您遷移數據庫之前會一直處於睡眠狀態。除此之外,還有在MS Access中執行SQL注入的其他方法,例如通過使用子查詢。)

通過使用PreparedStatement可以避免此問題。除此之外,它更方便編程:

Date date = /* java.sql.Date-object created from user input */ 

try (PreparedStatement stmt = conn.prepareStatement(
     "SELECT [date],[description] FROM Table2 where date=?") 
    ) { 

    // set first (and only) parameter value 
    stmt.setDate(1, date); 

    // execute statement 
    try (ResultSet result = stmt.executeQuery()) { 
     // process result as usual 
    } 
} 
+0

>第二條語句會簡單地刪除所有數據! ...不在Access SQL中 - 它會導致完整的語句失敗。 – Gustav

+0

@Gustav你說得對,MS Access不支持語句鏈。但是其他數據庫也可以,因此將代碼遷移到另一個DBMS可能會導致嚴重的安全漏洞。爲了簡單起見,我沒有提到這個細節。但我會更新我的答案。謝謝。 – isnot2bad

相關問題