2010-03-14 21 views
0

我試圖讓SQL查詢在JSP文件中工作。該JSP文件由這裏VXML文件拉着我的JSP文件中的代碼:JSP文件中的SQL查詢從VXML文件中提取變量

<?xml version="1.0"?> 
<%@ page import="java.util.*" %> 
<%@ page import="java.sql.*" %> 
<% boolean success = true; // Always optimistic 
String info = ""; 
String schoolname = request.getParameter("schoolname"); 
String informationtype = request.getParameter("informationtype"); 

try { 
     Class.forName("org.postgresql.Driver"); 
     String connectString = "jdbc:postgresql://localhost:5435/N0176359"; 
     String user = "****"; 
     String password = "*****"; 
     Connection conn = DriverManager.getConnection(connectString, user, password); 
     Statement st = conn.createStatement(); 
    ResultSet rsvp = st.executeQuery("SELECT * FROM lincolnshire_school_information_new WHERE school_name=\'"+schoolname+"\'"); 
     rsvp.next(); 
     info = rsvp.getString(2); 
}catch (ClassNotFoundException e) { 
     success = false; // something went wrong 
} 
%> 

正如你可以看到,我想插入聲明爲「schooname」到SQL查詢結束的變量的值。但是,當我運行jsp文件時,它不起作用,並且出現錯誤「ResultSet定位不正確」。當我把一個標準查詢(沒有試圖使它的變量值工作正常)

希望有道理,並感謝您的任何幫助!

回答

0

看起來沒給我,我懷疑它是事做你傳遞的參數 - 我建議以下調試步驟:

1)你可以打印schoolname參數的值,並驗證它是你認爲它是什麼?

2)您可以在執行它之前在變量中形成SQL語句,然後將其打印出來?

您可能還想檢查rsvp.next()調用的布爾返回值。如果它是假的,那麼你的查詢沒有返回行。 (javadoc代碼爲ResultSet.next()

+0

嗨, 我試過使用準備的語句,它不起作用。 我似乎成功地傳遞了變量,因爲我可以讓它通知變量。 – s1066 2010-03-14 20:13:55

+0

好的,如何打印SQL語句以便我們可以看到它並獲取返回代碼? – Brabster 2010-03-14 20:16:33

0

在嘗試訪問行的列之前,您會忽略ResultSet#next()的結果。如果有一行,則ResultSet#next()返回true,否則返回false。如果你試圖訪問一個不存在的行,那麼你會得到這種異常。

所以,如下更改以下兩行

rsvp.next(); 
    info = rsvp.getString(2); 

if (rsvp.next()) { 
     info = rsvp.getString(2); 
    } 

這樣的代碼將不再試圖訪問一個不存在的行。下一個問題可能是:「爲什麼它沒有返回一排」?答案是:「SQL查詢錯誤,或者行實際上不在數據庫中」。這個問題在於Java/JSP/JDBC的範圍之外。調試SQL查詢(運行一個調試器,或者只是做一個System.out.println()),並將其原樣複製到DB管理工具中並驗證/執行它。我敢打賭,這些超級反斜槓是問題的根源,或者說schoolname本身包含一個需要轉義的角色。

也就是說,這段代碼不屬於JSP文件。它屬於真正的Java類。爲時已晚,請開始learning servlets。另外我會再次基於Sun tutorial來學習JDBC,你的JDBC代碼就是泄露資源。您需要在try區塊的finally區塊中使用後釋放(關閉)它們,因爲您獲取了它們。此外,我會使用PreparedStatement而不是Statement將您的代碼從SQL injection attacks保存。前面提到的Sun教程也涵蓋了它。