【问题标题】:JDBC connection to MSSQL server in windows authentication modeWindows 身份验证模式下与 MSSQL 服务器的 JDBC 连接
【发布时间】:2013-05-11 14:14:51
【问题描述】:

在我的以下程序中,我尝试在 Windows 身份验证中使用 jdbc 连接 MSSQL Server。但是出现以下错误

import java.io.*;
import java.sql.*;
import java.util.GregorianCalendar;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

class  Cms_truncate
{
    public static void main(String[] args) 
    {
         Calendar cal = new GregorianCalendar();

         //String name="cmscim";
         //String filename = "D:\\programs\\Tomcat 6.0\\webapps\\timescape\\canteen_scheduller\\CMS_CSV\\cms_cim\\"+ name+"-"+cal.get(Calendar.YEAR) +"-" +(cal.get(Calendar.MONTH)+1) + "-"+cal.get(Calendar.DATE)+".csv";
         Connection conn = null;
         String url = "jdbc:sqlserver://localhost:1433;databasename=CMS_TIMES_MAIN;integratedSecurity=true";
         String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
         String userName = ""; 
         String password = "";
         Statement stmt;
         try
         {

         Class.forName(driver);//.newInstance();
         conn = DriverManager.getConnection(url,userName,password);
         String query = "select * from cim where sapId=10025331";
         stmt = conn.createStatement();
         int flag = stmt.executeUpdate(query);
         System.out.println("flag = "+flag); 
         conn.close();
        System.out.println("");
         } catch (Exception e) {
         e.printStackTrace();
         }

    }
}

我在 Windows 身份验证模式下使用 SQL Server。 我是否需要在 Windows 身份验证中使用 jdbc 连接 MSSQL 进行其他设置。

错误:

com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host localhost, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
    at com.microsoft.sqlserver.jdbc.SQLServerException.ConvertConnectExceptionToSQLServerException(SQLServerException.java:241)
    at com.microsoft.sqlserver.jdbc.SocketFinder.findSocket(IOBuffer.java:2243)
    at com.microsoft.sqlserver.jdbc.TDSChannel.open(IOBuffer.java:491)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1309)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at Cms_truncate.main(Cms_truncate.java:28)

【问题讨论】:

  • 您是否按照错误消息中的建议进行操作?
  • 那么您是否已将 SQL 服务器设置为允许端口 1433 上的 TCP/IP 连接?听起来你还没有。
  • 我没有收到那个错误。请帮忙解决一下
  • @Jon :怎么做?我需要任何 dll 来设置它吗
  • @yatinbc:进入您的 SQL Server 管理工具,并启用 TCP-IP 连接。如果这些信息对您来说还不够,请在网上搜索如何执行此操作 - 我相信很多地方都介绍过。

标签: java sql-server-2005 jdbc


【解决方案1】:

使用windows认证:

String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01;integratedSecurity=true";

使用SQL认证:

String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01";

【讨论】:

  • 如何在 AIX 系统上做到这一点? (sqljdbc_auth.dll 在 AIX 中不起作用)
  • 在 Linux 上的工作原理
【解决方案2】:

尝试以下步骤:

  1. 像这样将integratedSecurity=true 添加到 JDBC URL:

    Url: jdbc:sqlserver://<<Server>>:<<Port>>;databasename=<<DatabaseName>>;integratedsecurity=true 
    
  2. 确保在你的项目构建路径中添加sqljdbc驱动4或以上版本(sqljdbc.jar):

    java.sql.DatabaseMetaData metaData = connection.getMetaData();
    System.out.println("Driver version:" + metaData.getDriverVersion());
    
  3. 为您的项目添加 VM 参数:

    • 从数据库安装服务器(C:\Program Files\sqljdbc_4.0\enu\auth\x86)找到sqljdbc_auth.dll文件,或从this link下载。

    • 将 dll 文件放在您的项目文件夹中并指定 VM 参数,如下所示: 虚拟机参数:-Djava.library.path="&lt;&lt;DLL File path till folder&gt;&gt;"

      注意:检查您的 java 版本 32/64 位,然后相应地添加 32/64 位版本的 dll 文件。

【讨论】:

    【解决方案3】:

    您需要在 C:/windows/System32 文件夹中添加 sqljdbc_auth.dll。您可以从http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774 下载。

    【讨论】:

    • 这也是正确答案,加上在url中设置integratedSecurity=true。
    • 我认为把这个dll放在Windows\System32目录是不正确的。最好放入其他新目录并将其添加到PATH变量中。
    • 差不多就是这样。重写-Djava.library.path 有意想不到的副作用。例如丢失 java 加载的其他系统库。
    【解决方案4】:

    从您的异常跟踪来看,这个问题似乎有多种可能性

    1)。您必须检查您的端口 "1433" 是否被防火墙阻止。如果您发现它被阻止,那么您应该编写“入站规则”。如果在控制面板 -> windows 防火墙 -> 高级设置(在左侧找到的选项)-> 入站规则中找到它。

    2)。在 SQL Server 配置管理器中,您的 TCP/IP 协议将处于禁用模式。所以,你应该启用它。

    【讨论】:

    • 谢谢你的伙伴..!!
    【解决方案5】:

    您需要在 Sql Server 配置管理器应用中启用 SQL Server TCP/IP 协议。您可以在 SQL Server 网络配置中查看协议。

    【讨论】:

    • 答案是正确的,我们需要通过上述路径启用 TCP/IP。但是这样做之后还需要重新启动 SQL Server 服务来接受我们的更改。您可以在同一个服务器配置管理器应用程序中找到此服务。
    【解决方案6】:

    对于从 DataGrip 在 Windows 7 下测试的当前 MS SQL JDBC 驱动程序 (6.4.0):

    1. 根据documentation on authenticationScheme 使用完全限定的域名作为主机,例如server.your.domain不仅仅是server;该文档还提到了指定serverSpn=MSSQLSvc/fqdn:port@REALM 的可能性,但我无法为您提供有关如何使用它的详细信息。将 fqdn 指定为主机时,会自动生成 spn。
    2. 设置authenticationScheme=JavaKerberos
    3. 设置integratedSecurity=true
    4. 使用您不合格的用户名(和密码)登录

    由于这是使用 JavaKerberos,因此我希望得到有关这是否适用于 Windows 外部的反馈。我相信不需要 .dll,但是当我使用 DataGrip 创建连接时,我不确定;我也很感激对此的反馈!

    【讨论】:

      【解决方案7】:

      在通过以下 jdbc 字符串验证 Windows 用户时,出现“此驱动程序未配置为集成身份验证”的错误

      jdbc:sqlserver://host:1433;integratedSecurity=true;domain=myDomain

      所以更新的连接字符串使其工作如下。

      jdbc:sqlserver://host:1433;authenticationScheme=NTLM;integratedSecurity=true;domain=myDomain

      注意:输入的用户名没有域。

      【讨论】:

        【解决方案8】:

        如果您想进行 windows 身份验证,请使用最新的 MS-JDBC 驱动程序并按照此处的说明进行操作:

        https://msdn.microsoft.com/en-us/library/gg558122(v=sql.110).aspx

        【讨论】:

          【解决方案9】:

          苦苦挣扎,终于找到了解决办法,开始吧-

          下载文件jtds-1.3.1.jarntlmauth.dll并保存在Program File -> Java -> JDK -> jre -> bin中。

          然后使用下面的代码——

          String pPSSDBDriverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
          Class.forName(pPSSDBDriverName);
          DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
          conn = DriverManager.getConnection("jdbc:jtds:sqlserver://<ur_server:port>;UseNTLMv2=true;Domain=AD;Trusted_Connection=yes");
          stmt = conn.createStatement();
          String sql = " DELETE FROM <data> where <condition>;
          stmt.executeUpdate(sql);
          

          【讨论】:

          • 不要放在JDK/JREbin目录下!如果您更新 JDK/JRE,它将失败。最好将 ntlmauth.dll 文件放在您想要的任何位置(不是 jdk 位置)的自定义新目录中,并将此目录添加到 PATH 变量中。
          【解决方案10】:

          不,您的连接错误,请检查您的 IP 服务器地址或防火墙。

          com.microsoft.sqlserver.jdbc.SQLServerException:与主机 localhost 的 TCP/IP 连接失败,端口 1433。错误:“连接被拒绝:连接。验证连接属性。确保 SQL Server 实例正在主机上运行并在端口接受 TCP/IP 连接。确保与端口的 TCP 连接未被防火墙阻止。”

          1. ping yourhost(可能 ping 服务被阻止,但还是试试吧)。
          2. telnet yourhost 1433(可能被阻止)。
          3. 请与系统管理员联系并告知结果。

          【讨论】:

            【解决方案11】:

            您应该将您的 .dll => 复制到该文件夹​​中的“mssql-jdbc_auth-9.4.0.x64.dll” => sqljdbc_9.4\enu\auth\x64 到您的 Java JDK/bin。

            简短地说: => sqljdbc_9.4\enu\auth\x64\mssql-jdbc_auth-9.4.0.x64.dll 到 Program Files\Java\jdk-16\bin

            如果它不起作用,您可以打开 SQL Server 2019 配置管理器 -> SQL Server 网络配置,所有协议的名称都应启用。之后你应该点击 (TCP/IP) / IP Addresses,你会看到 IPALL-> TCP PORT 应该是 1433。

            【讨论】:

              猜你喜欢
              • 2019-06-28
              • 2016-03-11
              • 1970-01-01
              • 2015-06-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-29
              相关资源
              最近更新 更多