如题。。折腾了一夜还是没能解决T-T,诚请各路大神帮忙~感激不尽!报的错为:java.sql.SQLException: No suitable driver found for jdbc:sqlsever://localhost:1433;databaseName=Northwind;user=sa;password=1057738266;
不是:java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver虚拟机环境:全新安装windows server 2003 r2、sql server 2000、jdk7u17、tomcat7.0.39、sqljdbc_3.0.1301.203_enu.exe、没有配置任何环境变量。(我觉得环境不会有问题)将sqljdbc4.jar拷贝到${catalina.home}/lib下(sqljdbc_3.0.1301.203_enu.exe是微软支持sql server 2000和jdk7的最新版本驱动,应该也不会有问题)测试页如下:
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>无标题文档</title>
    </head>
    <body>
        <h1><%
    Connection connection = null;
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        connection = DriverManager.getConnection("jdbc:sqlsever://localhost:1433;databaseName=Northwind;user=sa;password=1057738266;");
    } catch (Exception e) {
        out.print(e);
    } finally {
        try {
            connection.close();
        } catch (Exception e) {
        }
    }
%></h1>
    </body>
</html>

解决方案 »

  1.   

    补充一下:
    1. 同样的jdbc驱动,我用纯命令javac编译,并写个测试类就没有问题,可以顺利访问到数据库。
    2. 在tomcat下,我特意先载入了驱动,并没有报找不到类的异常,但是在后面获取连接的位置报了无匹配驱动。Connection connection = null;
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        connection = DriverManager.getConnection("jdbc:sqlsever://localhost:1433;databaseName=Northwind;user=sa;password=1057738266;");
    } catch (Exception e) {
        out.print(e);
    } finally {
        try {
            connection.close();
        } catch (Exception e) {}
    }
      

  2.   


    应该不会,理由如下:
    第一,我使用纯命令的javac,一切正常。
    第二,此jdbc驱动就是专门适用于jdk7的,参见微软官方下载中心说明:Microsoft SQL Server JDBC Driver 3.0 with JRE7 getDate compatibility我怀疑是不是tomcat的某种机制导致的,有大神可以解答吗~
      

  3.   

    你的JDBC的jar包放在了什么位置?Tomcat只会在特定的位置搜索jar。
      

  4.   

    2000的java应该是
    String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; 
    String dbURL = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=xxx"; 
    驱动应该有三个
      

  5.   


    放在${catalina.home}/lib,就是tomcat安装根目录下的lib文件夹里,而且在执行到Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");这句话时并没有报找不到类的异常呀~一开始我也以为是找不到类,就做了个测验:
    把jdbc的jar移走,运行时抛出“java.lang.ClassNotFoundException”;重新放入jar,抛出“java.sql.SQLException: No suitable driver found for jdbc:sqlsever://localhost:1433;databaseName=Northwind;user=sa;password=1057738266;”。
    显然JDBC Driver类已被Tomcat搜索到。
      

  6.   


    你说的jdbc驱动很老了,可能不支持jdk7。不过我准备去尝试一下,谢谢:-)。
    我觉得我的驱动没有问题,是微软官方支持jdk7、sqlserver2000的最新驱动,见:http://www.microsoft.com/en-us/download/details.aspx?id=28562;且新驱动的字符串确实是“com.microsoft.sqlserver.jdbc.SQLServerDriver”
      

  7.   


    - -!请沿着我的链接去看,这个是Microsoft SQL Server JDBC Driver 3.0,Microsoft SQL Server JDBC Driver 4.0才不支持SQL Server 2000。原文摘录如下:
    Consider downloading the Microsoft JDBC Driver 4.0 for SQL Server instead. The 4.0 driver is our latest driver and also contains the fix to return correct date values with JRE 1.7. Customers using SQL Server 2000 with JRE 1.7 should download the driver on this page.
      

  8.   

    sql2000我这边引用三个jar包,分别是:msbase.jar\mssqlserver.jar\msutil.jar
    配置的时候分别是:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=xxx;SelectMethod=cursor
    com.microsoft.jdbc.sqlserver.SQLServerDriver
      

  9.   


    请问在jdk7+tomcat7下使用过吗?我这边暂时无法测试。。
      

  10.   

    推荐你看下这篇文章,没准就能解决了。
    http://blog.csdn.net/smstong/article/details/8129536
      

  11.   

    微软官方也提供了SqlServer的type 4 JDBC驱动,具体说来有两个文件:sqljdbc4.jar, sqljdbc.jar,其中带4的是最新的版本可以运行于JDK7.0下,而不带4的版本不能运行于
    JDK7下,问题是sqljdbc4.jar只支持SqlServer 2005以上的版本,不支持SqlServer 2000。也就是说要想通过微软提供的JDBC驱动操作SqlServer 2000,你的JDK版本一定要比JDK7低才行,可是我们的开发环境已经确定了是JDK7。
    有此想到了两个解决思路:一是使用JDBC-ODBC桥接,unixODBC是Linux平台上的ODBC实现,进而还需要安装SqlServer 2000的ODBC驱动,www.unixODBC.org给出了两个链接,一个不是免费开源的;另一个是基于freetds的ODBC驱动,不知为什么www.freetds.org网站打不开了。我以前用过freetds的命令行连接SqlServer还是不错的。ODBC的配置非常复杂,尤其是在Linux 环境下,特别不友好。懒惰的心理下,放弃了这种思路。二是既然freetds可以操作SqlServer,为什么不越过ODBC,让JDBC直接基于tds呢,很幸运在网上找到了一个好的解决方案:jTDS,详见http://jtds.sourceforge.net。这个项目提供了基于TDS协议的JDBC实现,是一个纯的type 4 JDBC驱动,通过一个jtds-1.3.0.jar即可满足通过JDBC访问SqlServer2000的需要。而且可以运行于JDK7.0下,正好满足我的要求。最终采取了第二种思路,关键代码如下:              Class.forName("net.sourceforge.jtds.jdbc.Driver");
                  DriverManager.registerDriver(new net.sourceforge.jtds.jdbc.Driver());
                  String dbUrl = "jdbc:jtds:sqlserver://IP地址:1433/数据库名";
      

  12.   


    非常感谢但是没用
    我刚刚测试了jdk6、jdk7、tomcat5.5、tomcat6、tomcat7、sqljdbc.jar、sqljdbc4.jar的所有12种组合全部宣告失败。。我开始怀疑是不是系统权限问题,或者虚拟机的问题。PS:文章中的sqljdbc4.jar不支持2000可以确定绝对是错的,因为我在命令提示符中使用javac来编译运行,一切正常
      

  13.   

    其实 也许是 微软为了阻止java的传播额 
      

  14.   

    Consider downloading the Microsoft JDBC Driver 4.0 for SQL Server instead unless you are using SQL Server 2000 with JRE 1.7.
    你自己读下这意思是什么,难道是我理解错误?
      

  15.   

    不仅仅要求将驱动加入classpath中,而且需要将该jar包加入到java运行环境的外部jar包
      

  16.   


    建议下载“Microsoft JDBC Driver 4.0”除非你正在使用SQL Server 2000 和 jre7。也就是说在jdk7+sql2000的环境下使用该驱动即“Microsoft JDBC Driver 3.0”(也就是连接指向的下载)。
    而“Microsoft JDBC Driver 4.0”在这里http://www.microsoft.com/en-us/download/details.aspx?id=11774补充:sqljdbc4.jar中的4并不指微软JDBC驱动的版本,而是指实现了JDBC 4.0的API。详见微软对JDBC驱动的说明:
    Starting with the Microsoft SQL Server JDBC Driver, the JDBC driver support for Java Database Connectivity (JDBC) Spec API has been extended to include the JDBC 4.0 API. The JDBC 4.0 was introduced as part of the Sun Java SE Development Kit (JDK) 6.0 and Java Runtime Environment (JRE) 6.0. JDBC 4.0 is a superset of the JDBC 3.0.也就是说,如果你使用JDK6之后的版本,可以使用sqljdbc4.jar,如果你使用比较老的JDK则使用sqljdbc.jar,但是他们都支持SQL Server 2000:The JDBC driver has been designed specifically to use features introduced with SQL Server 2005, but it is backward-compatible with SQL Server 2000, including the 64-bit version. JDBC Driver 3.0 supports the new date and time types, large user-defined types, and sparse columns in SQL Server 2008.
      

  17.   


    无论我将sqljdbc.jar放在tomcat公用lib文件夹,还是Webapp\我的APP\WEB-INF\lib文件夹,还是jre\lib\ext,还是3个都放,都不会抛出“java.lang.ClassNotFoundException”异常,都抛出的是“java.sql.SQLException: No suitable driver found”。如果三个地方都不放,则抛出“java.lang.ClassNotFoundException”异常。
      

  18.   


    那你如何理解的嘛~
    无论是网站上的说明http://www.microsoft.com/en-us/download/details.aspx?id=28562,还是下载后内部的说明文档,都明确说明了支持sql2000+jdk7呀~这是网页上的说明:
    Customers using SQL Server 2000 with JRE 1.7 should download the driver on this page.
      

  19.   


    而且再重申一下,我用这个驱动,使用纯javac命令编译,java命令运行,一点问题都没有。我其实十分想知道,Tomcat调用jar包是如何读取包内元信息的。我觉得是Tomcat的问题~
      

  20.   

    那我更多怀疑的是你没有安装SP4补丁。select @@version,自己找出原因了,安装sql 2000 sp4补丁时,那个exe是反解压式的,安装时只是把补丁解压到文件下,没真正升级,需要执行解压中的bat批处理程序!
      

  21.   


    当然安装啦,我做事是很严谨滴,每个readme都会去看一下。以下是说明文档的一部分:“
    从下列任一位置运行 Setup.bat 脚本:
    1. 在本地计算机上,包含从 SQL2000-KB884525-SP4-x86-LLL.exe 解压缩的 Service Pack 文件的文件夹,其中 LLL 因语言而异。
    2. SQL Server 2000 SP4 CD-ROM 上的根文件夹。
    3. 在网络共享位置上,包含从 SQL2000-KB884525-SP4-x86-LLL.exe 解压缩的 Service Pack 文件的文件夹。”
      

  22.   

    严谨点测试下,在查询分析器执行select @@version,查看下你的版本号,是否最新来确定安装成功。
      

  23.   

    如果 是  8.00.194  就是还没打补丁
            8.00.760  就是SP3
            8.00.2039 就是SP4
      

  24.   


    查到了:
    Microsoft SQL Server  2000 - 8.00.2066 (Intel X86) 
    May 11 2012 18:41:14 
    Copyright (c) 1988-2003 Microsoft Corporation
    Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)没错吧
      

  25.   


    谢谢啦~因为是最近全新安装的虚拟机,用Microsft Update啥补丁都打了
      

  26.   

    一是:连接URL格式出现了问题
    二是:驱动字符串出错
    三是Classpath中没有加入合适的驱动
    四是将该jar包加入到java运行环境的外部jar包中,即C:\Program Files\Java\jdk1.6.0_20\jre\lib\ext文件夹。刚刚上面说了第四点,没有细说,试试吧
      

  27.   


    第一、第二点,我直接拷贝的微软JDBC驱动说明文档中的URL和字符串。
    第三点,我不清楚tomcat的classpath是如何设置的,但是系统classpath肯定对tomcat无效,是确定的
    第四点,我放在ext文件夹中也没用。而且从道理上来说,classpath、和lib\ext文件夹应该是相同道理,做其一即可。我在命令模式下无论是定义classpath还是把jar包放到lib\ext文件夹下,都能成功编译运行,现在的问题是在tomcat下无法运行
      

  28.   

    Consider downloading the Microsoft JDBC Driver 4.0 for SQL Server instead unless you are using SQL Server 2000 with JRE 1.7.
      

  29.   

    楼主,你确实理解有点问题。
    [unless]:在除……外的任何情况下;除……情况之外Consider downloading the Microsoft JDBC Driver 4.0 for SQL Server instead unless you are using SQL Server 2000 with JRE 1.7除了using SQL Server 2000 with JRE 1.7情况外Consider downloading the Microsoft JDBC Driver 4.0 for SQL Server
      

  30.   

    因为这个是解决问题的关键,你不能用type4驱动
      

  31.   


    汗。帖子里可以插入附件吗?第一:Microsoft JDBC Driver 4.0 for SQL Server 这里的4.0 是微软的版本号,我在这里使用的是Microsoft JDBC Driver 3.0 for SQL Server。
    第二:就算是Microsoft JDBC Driver 2.0 for SQL Server 依然是一个Type 4的驱动,oracle官方java教程上有对Type 1至Type 4的具体解释,可以说,今天我们使用的所有jdbc驱动都是Type 4的,具体在这里http://docs.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html
    第三:sqljdbc4.jar中的4跟微软的4.0版本,或者jdbc的Type 4没有任何关系,他指的是实现了JDBC 4.0版本所定义的接口,不带sqljdbc.jar则实现了JDBC 3.0版本定义的接口。sqljdbc.jar是sqljdbc4.jar的子集。
    第四:我在前文提到我sqljdbc.jar、sqljdbc4.jar都使用了都没用。且我在命令下使用是没有问题的,如果按照你们说的,不匹配,那在命令模式下为什么一切正常?
      

  32.   


    所以啊我就是SQL Server 2000 with JRE 1.7的情况,所以我使用Microsoft JDBC Driver 3.0 for SQL Server没使用Microsoft JDBC Driver 4.0 for SQL Server(请注意我给的连接,到底是什么)
      

  33.   

    网上类似的问题解决方案:尝试着将mysql-connector-java-3.1.14-bin.jar的jar包加入C:\Program Files\Java\jre1.6.0_02\lib\ext文件夹下------
    楼主试试看
      

  34.   

    debug或者在DriverManager.setLogWriter()看一下具体的错误信息