36

我正在尝试运行以下代码:

import java.sql.DriverManager;

public class Connect {
    public static void main(String[] args){
        try{
            String databaseDriver = "net.sourceforge.jtds.jdbc.Driver";
            Class.forName(databaseDriver);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        try{
            String url = "jdbc:jtds:sqlserver://BHX:1433/Forecast;instance=SQLEPXRESS";
            java.sql.Connection con = DriverManager.getConnection(url);
            System.out.println("Connection");
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

我的 SQL 服务器在机器 BHX 上的端口 1433 上运行。

我收到的错误消息如下:

java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the     java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:352)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:185)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at Connect.main(Connect.java:14)
Caused by: java.io.IOException: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1893)
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:588)
    ... 6 more

我已经阅读了为什么通常会发生这种情况,并在这里找到了一个类似的问题,但这似乎不起作用。运行代码时,我包含以下参数来定位 SSO 文件:

-Djava.library.path=/Tester/jdbc/x64/SSO

这是我文件的结构

**Tester**
   *src*
     default package
         Connect.java
   *JRE System Library*
   *jdbc*
     conf
     html
     IA64
     x64
       SSO
        ntlmauth.dll
     x86

你能看出什么不对吗?

4

6 回答 6

73

似乎与此问题相同:jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not

您应该将相应的 ntlmauth.dll 文件从JTDS 下载包中拖放到您的 JRE bin 文件夹中。

如果您在 64 位 Windows 机器上运行:

  • 这个 32 位 DLL:

    下载 >>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 位于此 32 位 JRE 位置:

    C:\Program 文件 (x86)\Java\jre7\bin

  • 这个 64 位 DLL:

    下载 >>> jtds-1.3.0-dist.zip >>> x64 >>> SSO >>> ntlmauth.dll

  • 进入这个 64 位 JRE 位置:

    C:\Program Files\Java\jre7\bin

如果您在 32 位 Windows 机器上运行:

  • 这个 32 位 DLL:

    下载 >>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 位于此 32 位 JRE 位置:

    C:\Program Files\Java\jre7\bin

如果这不起作用,请尝试在 main 方法的顶部添加此行: System.out.println(java.lang.System.getProperty('java.library.path'));

它应该输出您的程序正在使用的实际 JRE 路径。确保相应的 ntlmauth.dll 在该 JRE 的 bin 文件夹中。

注意:使用此方法时,请勿设置连接的域、用户或密码属性。

注意:如果您的 Java 客户端程序在非 Windows 机器上运行,那么使用 ntlmauth.dll 方法会很不走运。这是来自 JTDS 下载包中包含的文档的引用:下载 >>> jtds-1.3.0-dist.zip >>> README.SSO

从 0.9.2 版开始,jTDS 能够使用当前用户的 Windows 凭据,客户端程序在其帐户下运行以登录到 SQL Server(Windows 单点登录)。

使用 Windows 单点登录 (SSO) 客户端无需提供凭据即可连接到 Microsoft SQL Server。它将动态读取当前用户的凭据并连接到数据库。前提是 Windows 帐户在数据库中有足够的权限。这是使用本机(仅限 Windows)库 ntlmauth.dll 完成的。

于 2013-05-07T22:17:22.843 回答
8

我有一个类似的问题,我试图将ntlmauth.dll文件放在我认为 sql-developer 会去寻找它的多个目录中。我终于通过将ntlmauth.dll文件放在\jdk\jre\binsql-developer 应用程序目录本身的文件夹中(即sql-developer\jdk\jre\bin)来让它工作。为什么 sql-developer 会在这个文件夹中而不是系统文件夹中查找 ntlmauth.dll,这超出了我的理解水平。无论如何,它奏效了。

以下是我刚刚回答的类似问题的链接。

Oracle SQL Developer 与 Microsoft SQL Server 的连接

于 2014-10-27T23:55:45.650 回答
4

即使在 JRE/bin 中成功放置 ntmauth.dll 文件后,我也会遇到同样的错误。

然后我尝试放入ntmauth.dll目录C:\Windows\System32。通过这样做,问题得到了解决。

于 2016-10-03T08:13:11.397 回答
1

好工作。

但是,在部署 JAR 文件时有一个小问题!

我建议创建一个文件夹(例如,lib)并将所有本机库复制到其中。最后添加一个 Java 执行参数:

java -jar your_jar.jar -Djava.library.path=./lib

这是从JTDS 驱动程序不适用于 SQL Server 2008R2 和 Denali Native SSPI 库未加载的启发。

于 2015-02-05T20:35:04.253 回答
1

未能通过身份验证参数会导致相同的错误,因此除了其他答案之外,您还可以在连接字符串中传递用户名和密码,例如

jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t
于 2016-03-09T23:52:29.857 回答
0

我通过将ntlmauth.dll文件放在\jdk\jre\bin. 我使用Tomcat作为我的应用程序服务器。

但是,我注意到这一次仅适用于一个部署的 Web 应用程序。如果我对多个 Web 应用程序有相同的设置,那么除了一个之外都失败了。这是一种相当奇怪的行为。知道这里发生了什么吗?

于 2015-11-18T13:41:47.500 回答