全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4019
推到 Plurk!
推到 Facebook!

利用?方式,從超連結傳值,要從資料庫查詢,出錯

尚未結案
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-15 15:16:02 IP:140.124.xxx.xxx 未訂閱
我利用?方式,在超連結中傳值給一網頁,如下     
 
"><%= rs.getString("subject") %>
再利用此值N, 來當SQL要查詢的條件,如下
 
String strQuery=" SELECT * FROM NewsContent WHERE ID='" request.getParameter("N") "' ";
rs=stmt.executeQuery(strQuery);
rs.beforeFirst();    if(!rs.next()) //如果找不到符合的資料
{
....
}
else //找到符合的資料了,顯示出來
{
  while(rs.next())
  {
    
主題 <%= rs.getString("subject") %>
公告內容 <textarea cols="36" rows="10"><b><%= rs.getString("news") ...... 結果出現下列的錯誤
 
HTTP Status 500 -     --------------------------------------------------------------------------------    type Exception report    message     description The server encountered an internal error () that prevented it from fulfilling this request.    exception     javax.servlet.ServletException: [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression.
        org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
        org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:795)
        org.apache.jsp.show_005fnews_jsp._jspService(show_005fnews_jsp.java:186)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)    root cause     java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression.
        sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
        sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
        sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
        sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
        sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
        org.apache.jsp.show_005fnews_jsp._jspService(show_005fnews_jsp.java:110)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)    note The full stack trace of the root cause is available in the Tomcat logs.    --------------------------------------------------------------------------------    Apache Tomcat/5.0.14    
發表人 - 黑輪 於 2004/11/15 15:54:40 發表人 - 黑輪 於 2004/11/15 16:05:26
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-15 16:40:34 IP:61.64.xxx.xxx 未訂閱
你的id欄位是數字還是文字形態的資料? 是數字就不用單引號包起來查詢吧 發表人 - neoart 於 2004/11/15 16:43:10
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-15 17:04:51 IP:140.124.xxx.xxx 未訂閱
我把單引號去掉
String strQuery=" SELECT * FROM NewsContent WHERE ID=" request.getParameter("N") ;
查詢的結果為找不到相符的,(我所傳過的N值為52)可是我用ACCESS的查詢功能
  SELECT * FROM NewsContent WHERE ID=52 
,有查到,是哪裡有問題嗎? 得謝謝你哦
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-15 18:45:21 IP:61.64.xxx.xxx 未訂閱
你的MDB可以給我下載來試嗎?
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-15 21:48:02 IP:218.167.xxx.xxx 未訂閱
我把檔案傳到 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59807 很感謝你花這麼多的時間幫我哦~
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-16 00:50:57 IP:61.56.xxx.xxx 未訂閱
以下是我測試的元件程式
import java.sql.*;
public class dbtest {
  Statement stm;
  Connection con;
  public dbtest() {
    try 
     {
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //載入驅動程式類別  
           con=DriverManager.getConnection("jdbc:odbc:orderDB");  //建立資料庫連線
           stm=con.createStatement(); //建立Statement物件,並設定記錄指標類型為可前後移動        
           String strQuery=" SELECT * FROM NewsContent WHERE ID=54";
           ResultSet rs=stm.executeQuery(strQuery);
           boolean hasData=false;
           while(rs.next()){
             System.out.println("subject is:" rs.getString("subject") ",context is:" rs.getString("news"));
             System.out.println("publish at:" rs.getString("publish_time"));
             hasData=true;
           }
           if(!hasData){
             System.out.println("Sorry, No data found");
           }
       
     }
     catch(Exception ex)
     {
       System.out.println(ex.toString());  
     }
    
  }
  public static void main(String[] args) {
    dbtest dbtest1 = new dbtest();
  }    }
看出什麼不一樣的嗎? 你要不要試一下把你的:
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); //建立Statement物件,並設定記錄指標類型為可前後移動...
改成
stmt=con.createStatement(); //建立Statement物件,並設定記錄指標類型為可前後移動
改完後試一下吧
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-16 09:38:35 IP:61.228.xxx.xxx 未訂閱
我改成 
stmt=con.createStatement();  
後,出現下列的訊息
 
HTTP Status 500 -     --------------------------------------------------------------------------------    type Exception report    message     description The server encountered an internal error () that prevented it from fulfilling this request.    exception     javax.servlet.ServletException: Result set type is TYPE_FORWARD_ONLY
        org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
        org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:795)
        org.apache.jsp.show_005fnews_jsp._jspService(show_005fnews_jsp.java:189)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)    root cause     java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
        sun.jdbc.odbc.JdbcOdbcResultSet.beforeFirst(JdbcOdbcResultSet.java:2102)
        org.apache.jsp.show_005fnews_jsp._jspService(show_005fnews_jsp.java:114)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:856)    note The full stack trace of the root cause is available in the Tomcat logs.    --------------------------------------------------------------------------------    Apache Tomcat/5.0.14
好像是說,指標只能向前移動,還有,我在add_news.jsp這一個頁面時,把指標設定"從後向前"移動,所以在顯示資料時,會從最後一筆開始顯示,跟這個有關係嗎?
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-16 12:29:05 IP:61.56.xxx.xxx 未訂閱
你的jdk是哪一版的? 我是用1.4.x 建議你用order by的方式決定你要的順序查詢,這樣會比較不會有問題 以下是我修改好的code
==========================================================
 ...
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //載入驅動程式類別
           con=DriverManager.getConnection("jdbc:odbc:orderDB");  //建立資料庫連線
           stm=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); //建立Statement物件,並設定記錄指標類型為可前後移動
           String strQuery="select * from newscontent where id=54";
           ResultSet rs=stm.executeQuery(strQuery);
           boolean hasData=false;
           while(rs.next()){
             System.out.println("subject is:" rs.getString("subject") ",context is:" rs.getString("news"));
             System.out.println("publish at:" rs.getString("publish_time"));
             hasData=true;
           }
           if(!hasData){
             System.out.println("Sorry, No data found");
           }
....
==========================================================
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-16 13:06:32 IP:140.124.xxx.xxx 未訂閱
把改成 
 stm=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
且排序用ORDER BY,結果也是找不到(可是明明資料庫裡就有新增的資料)~~請問我是否有哪裡又弄錯了? PS:我是j2sdk1.4.2_03這一版的~
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-16 13:23:00 IP:218.174.xxx.xxx 未訂閱
TYPE_SCROLL_SENSITIVE 換成 TYPE_FORWARD_ONLY 是否可行呢?
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-16 14:05:52 IP:61.56.xxx.xxx 未訂閱
引言: 把改成 stm=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 且排序用ORDER BY,結果也是找不到(可是明明資料庫裡就有新增的資料)~~請問我是否有哪裡又弄錯了? PS:我是j2sdk1.4.2_03這一版的~
你的 strQuery=" SELECT * FROM NewsContent WHERE 要不要改成 strQuery="SELECT * FROM NewsContent WHERE...." 我之前就是有遇到query有空白就查錯的情事發生.
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-16 15:12:28 IP:140.124.xxx.xxx 未訂閱
哇~我把空白去掉,然後再加上一行 
 rs.beforeFirst();
 
  rs.beforeFirst();
  while(rs.next())
  {
就可以了~之前是像下面這樣
 
rs=stmt.executeQuery(strQuery);
rs.beforeFirst();
hahalin朋友,我用
TYPE_FORWARD_ONLY  
,會出現
Result set type is TYPE_FORWARD_ONLY 
的錯誤哦~很感謝兩位大力相助哦~~
系統時間:2024-05-09 10:59:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!