In jsp, forName("sun.jdbc.odbc.JdbcOdbcDriver") run successfully. When
used in JavaBean,
forName will fail. While run JavaBean class directly, it works. Why?
The following is the code.
package com;
import java.io.*;
import java.util.*;
import java.sql.*;
public class Publisher {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Connection conn = null;
ResultSet rs = null;
public Publisher() {
}
public boolean open(String url, String user, String passwd) {
try {
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(url, user, passwd);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public ResultSet executeQuery(String sql) {
if (conn == null) {
return null;
}
rs = null;
try {
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}
catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public void close() {
try {
rs.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Publisher pb = new Publisher();
pb.open("jdbc:odbc:Publisher", "user", "user");
ResultSet rs = pb.executeQuery("SELECT * FROM Publisher");
String id, name, url;
System.out.println("Publisher_ID Name URL");
try {
while (rs.next()) {
id = rs.getString("Publisher_ID");
name = rs.getString("name");
url = rs.getString("url");
System.out.println(id + " " + name + " " + url);
}
} catch (SQLException e) {
e.printStackTrace();
}
pb.close();
}
}
// !!!!!!!!!!!!!!!!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!
>java com.Publisher // OK!
http://localhost:8080/publisher.jsp will report error for open(url,
user, passwd) return false;
Allen - 02 Aug 2006 07:54 GMT
// My platform is jre1.5.0_06, Tomcat 5.5
// JSP file
<%@ page language="java" import="java.sql.*" %>
<jsp:useBean id="pb" class="com.Publisher" scope="page" />
<html>
<head>
<title>List of Publisher</title>
</head>
<body>
<%!
String id, name, url;
%>
<h1>Publisher_ID Name URL</h1>
<% try {
if (!pb.open("jdbc:odbc:Publisher", "user", "user")) {
out.print("error");
}
ResultSet rs = pb.executeQuery("SELECT * FROM Publisher");
if (rs != null) {
while (rs.next()) {
id = rs.getString("Publisher_ID");
name = rs.getString("name");
url = rs.getString("url");
%>
<h2>
<%= id + " " + name + " " + url %>
</h2>
<% }
rs.close();
}
} catch (SQLException e) {
}
%>
</body>
</html>
Allen - 02 Aug 2006 08:45 GMT
java.sql.SQLException: [Microsoft][ODBC Driver Manager] not found data
source name and not spcified default driver
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.Publisher.open(Publisher.java:19)
at org.apache.jsp.publisher_jsp._jspService(publisher_jsp.java:65)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Allen - 02 Aug 2006 09:40 GMT
Yes. I found it was caused by DriverManager.getConnection(url, user,
passwd).
When run java class directly, it can use odbc configured data source,
i.e.
database url can be "jdbc:odbc:Publisher".
But in JavaBean, url can only be used as
"jdbc:odbc:driver={Microsoft Access Driver
(*.mdb)};DBQ=E:/publisher.mdb".
Why?