【问题标题】:JDBC (Microsoft SQL Server): No suitable driver found for urlJDBC(Microsoft SQL Server):找不到适合 url 的驱动程序
【发布时间】:2020-05-06 14:28:30
【问题描述】:

我正在尝试连接到托管在 ESXI 服务器上的现有数据库,但我似乎无法正确找到驱动程序。

我使用的代码如下:

new ConnectToDb('jdbc:sqlserver:sqltest3:CI-ESXI', 'USER', 'PASSWORD', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')

    ConnectToDb(String url, String user, String password, String driver) {
        Class.forName(driver)
        database =  groovy.sql.Sql.newInstance(url, user, password, driver)
    }

我收到以下错误:

线程“main”java.sql.SQLException 中的异常:没有合适的驱动程序 找到 jdbc:sqlserver:sqltest3:CI-ESXI

另外,我尝试了以下,java风格,代码:

void connect(String url, String user, String password, String driver) throws SQLException {
    if (null == stmt || stmt.isClosed()) {
        // Create a connection to the database
        if (database_url == null) {
            throw new SQLException("Cannot connect to database, connection URL is null.")
        }

        Properties  database_infos = new Properties()

        database_infos.put("user", user)
        database_infos.put("password", password)
        database_infos.put("driver", driver)

        Class.forName(driver)
        connection = DriverManager.getConnection(url, database_infos)
        stmt = connection.createStatement()
    }
}

返回相同的异常。

其实直接调用DriverManager.getDriver(driver)会返回同样的异常。

驱动添加到POM.xml文件中的方式如下:

<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>7.4.1.jre8</version>
</dependency>

它被添加到类路径中,我可以通过以下方式将其导入任何java文件import com.microsoft.sqlserver.jdbc.SQLServerDriver而不会出错

我在 Groovy 项目中使用 IntelliJ IDEA,但我可以在纯 Java 项目中重现 Eclipse 中的错误。所以它似乎不是基于语言/IDE的。

所以现在我对此有点不知所措,有什么想法吗?

【问题讨论】:

  • 它在运行时在你的类路径中吗?
  • 好吧,我相信是的,如果你问这个问题,我认为导入工作的事实并不能保证它在运行时位于类路径中。我该如何验证?这不就是 Class.forname(driver) 调用的作用吗?
  • 导入语句在编译时解析(java 编译器,javac)。您是在 IDE 内部还是外部看到这些错误消息?
  • JDBC 驱动程序与 SQL Server Management Studio 无关。
  • 为什么您认为jdbc:sqlserver:sqltest3:CI-ESXI 是 Microsoft SQL Server JDBC 驱动程序的有效 JDBC url?它与its documentation 中的 URL 语法不匹配。

标签: java sql-server jdbc groovy database-connection


【解决方案1】:

所以我发现了,错误消息完全具有误导性,因为问题出在 URL 中,应该是:

'jdbc:sqlserver://sqltest3'

如果 // 不存在,则 connectedProperties 将返回 null,并且没有提供驱动程序,因此会出现错误消息。

【讨论】:

  • 所以你一开始没有显示 URL。然而,有趣的是,听起来要么是 sqlserver 驱动程序的文档不足,要么你把它变成了一个实际的错误。
  • @ThorbjørnRavnAndersen OP 使用的 URL 在语法上根本不正确,驱动程序应该忽略他们无法识别的 URL。这反过来会导致“找不到合适的驱动程序”错误。 Microsoft SQL Server JDBC url 的语法记录在 Building the Connection URL
  • 是的,这就是发生的事情,而不是告诉我“你的 url 无效”,sqlserverdriver 使所有属性无效,然后运行到“我没有驱动程序”
  • @MarkRotteveel 有趣。显然,自从我阅读此内容以来已经太久了 - 我相信当驱动程序匹配“sqlserver”位时,它负责处理 URL,而不仅仅是默默地忽略它。
  • @ThorbjørnRavnAndersen javadoc 只说 “如果驱动程序意识到连接到给定 URL 的驱动程序类型错误,则应返回“null”。”。所以他们应该接受他们识别的 URL,否则返回null。如果他们识别出 URL,但失败了,他们应该抛出一个异常。 JDBC 中没有要求说,如果您支持某个协议前缀,则必须处理具有该前缀的所有 URL:如果驱动程序使用相同的前缀甚至是完全可以接受的,只要您记住第一个接受并成功连接“wins”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2012-07-14
  • 2020-05-02
  • 2013-04-01
  • 2014-07-14
相关资源
最近更新 更多