Eclipse:Photon -- 没有找到适合 jdbc:sqlserver:/---/ 的驱动程序,但仅在"调用"java 类时



这个让我很困惑。我从头开始重新构建了所有内容以缩小问题范围,而且我似乎根本无法从类外调用执行JDBC调用的静态函数。当类自己运行时,这很好,但当静态调用时,我会得到可怕的"找不到合适的驱动程序"。

我试过:

  • 重建我的虚拟Tomcat服务器

  • 不同版本的jar(7,8,9(mssql-jdbc-6.4.0.jre7.jar->jre9.jar

  • 不同的"导入"或"构建路径/库"设置

  • JRE(1.8&10(的不同版本

  • 将JAR直接放入我的工作区…/…/。。。wtpwebapps/APP/WEB-INF/lib

  • 一个独立的JAVA包(运行良好(vs动态Web包(失败(

  • 逐个重建Class,并在下进行总结

当类通过MAIN((独立运行时,一切都很好。但是当它从另一个类或JSP调用时,它无法处理它

我的测试类

import java.sql.*;
public class DB_TEST {
private static String SQL_URL  = "jdbc:sqlserver://HostIP:1433;databaseName=TEST_DB";
private static String SQL_User = "RO-User";
private static String SQL_Pass = "RO-Pass";
public static void main(String[] args) {
System.out.println(getCurrentUsers());
}
public static String getCurrentUsers() {
String sOut = "";
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con = DriverManager.getConnection(SQL_URL, SQL_User, SQL_Pass);
String SQL = "SELECT * FROM USERS";
stmt = con.createStatement();
rs = stmt.executeQuery(SQL);
while (rs.next()) {
sOut += (rs.getString("User_GUID"))+"n";
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
}
return sOut;
}
}

输出

AB6C77C9-1EC5-498A-8ED1-1AF8487B8CC8
456F75B3-5E3D-475C-B26D-218D9D9E04C2
AA101A7C-27B1-4F05-B12D-3A18A062986F
5915D156-DB0D-4CCA-9A65-601117649DC1
935DB225-39B8-4561-A4B9-702090323312
6BC1F025-6173-4634-90B8-9182673523B3
7B86E02F-AB57-4158-8586-B200C2B7D851

我的连接字符串看起来像:"jdbc:sqlserver://HostIP:1433;databaseName=TEST_DB"

我的测试Servlet

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DB_Call_Test")
public class DB_Call_Test extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append( DB_TEST.getCurrentUsers() );
}
}

我的测试JSP

<%@ page import="java.sql.*,java.util.List" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Why does this fail?</title>
</head>
<body>
Current Usssers:<br/>
<%= DB_TEST.getCurrentUsers()  %>
</body>
</html>

持续错误-来自JSP或姐妹类

java.sql.SQLException: No suitable driver found for jdbc:sqlserver://HostIP:1433;databaseName=TEST_DB
at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
at DB_TEST.getCurrentUsers(DB_TEST.java:41)
...

所以。事实证明。即使在最新的JDK/JRE/Tomcat/JARs下,Tomcat仍然需要弃用的Class.forName((语句。我尝试了很多方法来加载这些该死的驱动程序,包括支持JNDI定义。起初我认为这是解决方案。

从那以后,我放弃了一切,除了:

import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Driver.*;
import java.sql.DriverManager.*;
import com.microsoft.sqlserver.jdbc.*;
import java.util.*;
...
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"));
con = DriverManager.getConnection("jdbc:sqlserver://HostIP:1433;databaseName=TEST_DB", <SQL_User>, <SQL_Pass>);

我注意到很多文档显示了错误的SQL Server驱动程序名称(v9.jar(。它们都说:com.microsoft.sqlserver.jdbc.Driver,但应该是jdbcSQLServerDriver。我只是通过打开JAR并自己找到它就明白了这一点。

相关内容

最新更新