Java.sql.SQLException:jdbc:microsoft:sqlserver没有适合的驱动程序。

65

当我尝试运行这个程序时,我遇到了这个异常。这是微软的例子之一。我已经在netbeans中通过项目属性将sqljdbc4.jar添加到类路径中,用于编译和运行。我还通过下面的导入语句测试了该类是否可被找到-编译期间没有错误,因此它必须正在找到jar包。

可能与sqldbc4.jar引用的某个dll或某些SQL dll有关吗?

这是精确的异常信息以及精确的代码,除密码外。

异常:

run:
java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://localhost:1433;databaseName=HealthCareDatabase
Error Trace in getConnection() : No suitable driver found for jdbc:microsoft:sqlserver://localhost:1433;databaseName=HealthCareDatabase
Error: No active Connection
    at java.sql.DriverManager.getConnection(DriverManager.java:602)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at javaapplication1.Connect.getConnection(Connect.java:35)
    at javaapplication1.Connect.displayDbProperties(Connect.java:50)
    at javaapplication1.JavaApplication1.main(JavaApplication1.java:23)
BUILD SUCCESSFUL (total time: 1 second)

代码:

 package javaapplication1;
import com.microsoft.sqlserver.jdbc.SQLServerDriver;

import java.*;

public class Connect {

    private java.sql.Connection con = null;
    private final String url = "jdbc:microsoft:sqlserver://";
    private final String serverName = "localhost";
    private final String portNumber = "1433";
    private final String databaseName = "HealthCareDatabase";
    private final String userName = "larry";
    private final String password = "xxxxxxx";

    // Constructor
    public Connect() {
    }

    private String getConnectionUrl() {
        return url + serverName + ":" + portNumber + ";databaseName=" + databaseName ;
    }

    private java.sql.Connection getConnection() {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = java.sql.DriverManager.getConnection(getConnectionUrl(), userName, password);
            if (con != null) {
                System.out.println("Connection Successful!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error Trace in getConnection() : " + e.getMessage());
        }
        return con;
    }

    public void displayDbProperties() {
        java.sql.DatabaseMetaData dm = null;
        java.sql.ResultSet rs = null;
        try {
            con = this.getConnection();
            if (con != null) {
                dm = con.getMetaData();
                System.out.println("Driver Information");
                System.out.println("\tDriver Name: " + dm.getDriverName());
                System.out.println("\tDriver Version: " + dm.getDriverVersion());
                System.out.println("\nDatabase Information ");
                System.out.println("\tDatabase Name: " + dm.getDatabaseProductName());
                System.out.println("\tDatabase Version: " + dm.getDatabaseProductVersion());
                System.out.println("Avalilable Catalogs ");
                rs = dm.getCatalogs();
                while (rs.next()) {
                    System.out.println("\tcatalog: " + rs.getString(1));
                }
                rs.close();
                rs = null;
                closeConnection();
            } else {
                System.out.println("Error: No active Connection");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        dm = null;
    }

    private void closeConnection() {
        try {
            if (con != null) {
                con.close();
            }
            con = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        Connect myDbTest = new Connect();
        myDbTest.displayDbProperties();
    }

}

的翻译是:

}


你好.. 你解决了这个问题吗?我也遇到了同样的问题..请帮帮我。 - Piraba
2
为了解决上述问题,请查看下面我简单的代码... - Fathah Rehman P
请下载sqljdbc4.jar并将其放置在Jmeter的lib目录中。 - user2087766
6个回答

77

4
混淆问题归咎于旧版本驱动程序。新版本提到了应使用的正确前缀(jdbc:sqlserver://)。 - László van den Hoek
16
很多网站的 URL 都是错误的。它们使用 'jdbc:microsoft:sqlserver://server:port;DatabaseName=dbname ' 而不是正确的 'jdbc:sqlserver://server:port;DatabaseName=dbname '。 - screechOwl
1
你应该把驱动程序放在哪里? - Demodave
1
驱动程序链接失效。 - Itération 122442

11

对于想要使用Maven解决相同问题的人,请在POM文件中加入以下依赖项:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>7.0.0.jre8</version>
</dependency>

使用以下代码进行连接:

String connectionUrl = "jdbc:sqlserver://localhost:1433;databaseName=master;user=sa;password=your_password";

try {
    System.out.print("Connecting to SQL Server ... ");
    try (Connection connection = DriverManager.getConnection(connectionUrl))        {
        System.out.println("Done.");
    }
} catch (Exception e) {
    System.out.println();
    e.printStackTrace();
}

寻找此链接以获取其他CRUD类型的查询。


很棒!对于使用Java 8的应用程序,这是适当的驱动程序。而不是8.2.2.jre11,它给我带来了许多连接问题。 - Jyotirmay

10

以下是一个简单的从SQL数据库读取数据的代码。数据库名为 "database1",表名为 "table1",包含两列 "uname" 和 "pass"。请勿忘记将 "sqljdbc4.jar" 添加到您的项目中。下载 sqljdbc4.jar

public class NewClass {

    public static void main(String[] args) {

        Connection conn = null;
        String dbName = "database1";
        String serverip="192.168.100.100";
        String serverport="1433";
        String url = "jdbc:sqlserver://"+serverip+"\\SQLEXPRESS:"+serverport+";databaseName="+dbName+"";
        Statement stmt = null;
        ResultSet result = null;
        String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String databaseUserName = "admin";
        String databasePassword = "root";
        try {
            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection(url, databaseUserName, databasePassword);
            stmt = conn.createStatement();
            result = null;
            String pa,us;
            result = stmt.executeQuery("select * from table1 ");

            while (result.next()) {
                us=result.getString("uname");
                pa = result.getString("pass");              
                System.out.println(us+"  "+pa);
            }

            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Aniket - 请粘贴您收到的完整异常信息。 - Fathah Rehman P
我正在使用Netbeans 7.0.1开发Web应用程序。异常信息如下:SEVERE: Java运行环境(JRE)版本1.7不受此驱动程序支持。请使用sqljdbc4.jar类库,该类库提供对JDBC 4.0的支持。 SEVERE: java.lang.UnsupportedOperationException: Java运行环境(JRE)版本1.7不受此驱动程序支持。请使用sqljdbc4.jar类库,该类库提供对JDBC 4.0的支持。 - Aniket
@Aniket - 你已经将sqljdbc4.jar添加到你的项目中了吗?如果你已经添加了sqljdbc4.jar,请确保没有将sqljdbc.jar添加到项目中。 - Fathah Rehman P
这对我有用。谢谢。但是我用 DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver()); 替换了 Class.forName(driver).newInstance(); 并在我的Mavin的pom中添加了依赖项 'com.microsoft.sqlserver',以使其正常工作。 - mcemmy

5

我遇到了同样的错误,但我的连接字符串是正确的。我的问题在于驱动程序未被使用,因此已经被编译war文件优化掉。

请确保导入驱动程序:

import com.microsoft.sqlserver.jdbc.SQLServerDriver;

然后,为了强制将其包含在最终的战争中,您可以像这样做:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

那行代码在原问题中已经给出。以下方法同样有效:

SQLServerDriver driver = new SQLServerDriver();

0

您可以尝试使用sqljdbc4-2.0.jar,如下所示:

 public void getConnection() throws ClassNotFoundException, SQLException, IllegalAccessException, InstantiationException {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        String url = "jdbc:sqlserver://<SERVER_IP>:<PORT_NO>;databaseName=" + DATABASE_NAME;
        Connection conn = DriverManager.getConnection(url, USERNAME, PASSWORD);
        System.out.println("DB Connection started");
        Statement sta = conn.createStatement();
        String Sql = "select * from TABLE_NAME";
        ResultSet rs = sta.executeQuery(Sql);
        while (rs.next()) {
            System.out.println(rs.getString("COLUMN_NAME"));
        }
    }

0

尝试将存档文件.JAR附加到NETBEANS项目中的Libraries中。注意:项目类别必须为“Ant”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接