[英]Windows Authentication problem while connecting to MSSQL server from JDBC
[英]JDBC connection to MSSQL server in windows authentication mode
在我的以下程序中,我尝试在 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 服务器。 我是否需要设置其他设置以在 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)
使用 Windows 身份验证:
String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01;integratedSecurity=true";
使用 SQL 身份验证:
String url ="jdbc:sqlserver://PC01\inst01;databaseName=DB01";
尝试执行以下步骤:
将integratedSecurity=true
添加到 JDBC URL 中,如下所示:
Url: jdbc:sqlserver://<<Server>>:<<Port>>;databasename=<<DatabaseName>>;integratedsecurity=true
确保在您的项目构建路径中添加 sqljdbc 驱动程序 4 或更高版本(sqljdbc.jar):
java.sql.DatabaseMetaData metaData = connection.getMetaData(); System.out.println("Driver version:" + metaData.getDriverVersion());
为您的项目添加 VM 参数:
从已安装 DB 的服务器(C:\\Program Files\\sqljdbc_4.0\\enu\\auth\\x86)
找到sqljdbc_auth.dll文件,或从此链接下载。
将 dll 文件放在您的项目文件夹中,并像这样指定 VM 参数:VM 参数: -Djava.library.path="<<DLL File path till folder>>"
注意:检查您的 java 版本 32/64 位,然后相应地添加 32/64 位版本的 dll 文件。
您需要在 C:/windows/System32 文件夹中添加 sqljdbc_auth.dll。 您可以从http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774下载它。
从您的异常跟踪来看,此问题似乎有多种可能性
1)。 您必须检查您的端口“1433”是否被防火墙阻止。 如果您发现它被阻止,那么您应该编写“入站规则”。 如果在控制面板 -> Windows 防火墙 -> 高级设置(在左侧找到选项) ->入站规则中找到它。
2)。 在 SQL Server 配置管理器中,您的TCP/IP
协议将处于禁用模式。 所以,你应该启用它。
您需要在 Sql Server Configuration Manager 应用程序中启用 SQL Server TCP/IP 协议。 您可以在 SQL Server 网络配置中看到该协议。
对于在 Windows 7 下从 DataGrip 中测试的当前 MS SQL JDBC 驱动程序 (6.4.0):
server.your.domain
而不仅仅是server
; 该文档还提到了指定serverSpn=MSSQLSvc/fqdn:port@REALM
的可能性,但我无法为您提供有关如何使用它的详细信息。 将 fqdn 指定为主机时,将自动生成 spn。authenticationScheme=JavaKerberos
integratedSecurity=true
由于这是使用 JavaKerberos,我将不胜感激有关这是否适用于 Windows 外部的反馈。 我相信不需要 .dll,但是当我使用 DataGrip 创建连接时,我不确定; 我也很感激对此的反馈!
如果要进行 Windows 身份验证,请使用最新的 MS-JDBC 驱动程序并按照此处的说明进行操作:
https://msdn.microsoft.com/en-us/library/gg558122(v=sql.110).aspx
不,您有一个连接错误,请检查您的 IP 服务器地址或您的防火墙。
com.microsoft.sqlserver.jdbc.SQLServerException:到主机 localhost 的 TCP/IP 连接,端口 1433 失败。 错误:“连接被拒绝:连接。验证连接属性。确保 SQL Server 实例正在主机上运行并在端口接受 TCP/IP 连接。确保到端口的 TCP 连接未被防火墙阻止.” .
苦苦挣扎,终于找到了解决办法,开始吧——
下载文件jtds-1.3.1.jar
和ntlmauth.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);
在按照 jdbc 字符串对 Windows 用户进行身份验证时,我收到错误消息“此驱动程序未配置为集成身份验证”
jdbc:sqlserver://host:1433;integratedSecurity=true;domain=myDomain
因此,更新后的连接字符串使其工作如下。
jdbc:sqlserver://host:1433;authenticationScheme=NTLM;integratedSecurity=true;domain=myDomain
注意:输入的用户名没有域。
您应该将您的 .dll => here "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 服务器网络配置,所有协议的名称都应启用。 之后你应该点击 (TCP/IP) / IP Addresses,你会看到 IPALL-> TCP PORT 应该是 1433。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.