在Windows身份验证模式下与MSSQL服务器的JDBC连接

时间:2013-05-11 14:14:51

标签: java sql-server-2005 jdbc

在我的下一个程序中,我试图在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。

ERROR:

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)

10 个答案:

答案 0 :(得分:9)

使用Windows身份验证:

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

使用SQL身份验证:

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

从您的异常跟踪中,看起来这个问题存在多种可能性

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

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

答案 3 :(得分:4)

您需要在Sql Server Configuration Manager应用程序中启用SQL Server TCP / IP协议。您可以在SQL Server网络配置中查看协议。

答案 4 :(得分:4)

请尝试按照以下步骤操作:

  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参数,如下所示: VM参数:-Djava.library.path="<<DLL File path till folder>>"

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

答案 5 :(得分:2)

对于在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. 使用您的非限定用户名(和密码)登录
  5. 由于这是使用JavaKerberos,我希望得到关于这是否适用于外部Windows的反馈。我相信不需要.dll,但是当我使用DataGrip创建连接时,我不确定;我也很感激对此的反馈!

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

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

  1. ping您的主机(也许ping服务已被阻止,但是仍然可以尝试)。
  2. telnet yourhost 1433(可能被阻止)。
  3. 将结果与系统管理员联系。

答案 8 :(得分:0)

经过很多努力,我终于找到了解决方案,我们开始吧-

下载文件jtds-1.3.1.jarntlmauth.dll并将其保存在程序文件-> 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);

答案 9 :(得分:0)

我通过遵循jdbc字符串对Windows用户进行身份验证时出现错误,因为“未为此驱动程序配置集成身份验证”

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

因此,更新后的连接字符串将使其正常工作。

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

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