1

这很奇怪。我在运行 VirtualBox 4.2.6 的 Mac OS X 10.7.5 64 位主机上。我有一个运行 Microsoft SQL Server Express 2012 的带有桥接网络的 Windows 7 SP1 来宾(64 位)。我将 SQL Server 配置为在端口 1433 上使用 TCP/IP,而不是动态端口(设置为空白,而不是 0)。Windows 7 来宾的 IPv4 地址为 192.168.99.132,并且 Windows 防火墙已关闭。

我下载了 Microsoft SQL Server 2012 JDBC 驱动程序以及适用于 Windows 和 Mac 的 Squirrel SQL 客户端 3.4.0。当我在 Windows 7 来宾操作系统本身上运行 Squirrel 时,我可以通过 Microsoft JDBC 驱动程序使用“winny”、“localhost”或“192.168.99.132”的来宾计算机名称(JDBC URL 像jdbc:sqlserver://winny\SQLEXPRESS:1433;databaseName=vha)。但是,当我尝试从 Mac 主机上运行的 Squirrel 连接到 SQL Server 时,出现异常(请参阅下面的堆栈跟踪)。

这是奇怪的部分。如果从 Mac 主机上,我使用 jTDS SQL Server 驱动程序(版本 1.2.7,因为我使用的是 JDK6,所以不能使用 jTDS 1.3.0 - 该版本仅是 JDK7),我会立即连接JDBC URL jdbc:jtds:sqlserver://192.168.99.132:1433/vha。

任何想法为什么 Microsoft 驱动程序失败但 jTDS 从远程主机成功?Microsoft 中的 jTDS URL 中唯一缺少的信息是实例名称(“SQLEXPRESS”)。是的,我尝试了带有和不带有实例名称的 Microsoft URL。

Mac 主机上的 Java 版本为:

java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

Windows 7 客户机上的 Java 版本为:

java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10)
Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01, mixed mode)

从 Mac 主机连接到 Windows 7 客户机时的堆栈跟踪:

java.util.concurrent.ExecutionException: java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 192.168.99.132, port 1433 has failed. Error: "null. 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 java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:232)
    at java.util.concurrent.FutureTask.get(FutureTask.java:91)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.awaitConnection(OpenConnectionCommand.java:132)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.access$100(OpenConnectionCommand.java:45)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand$2.run(OpenConnectionCommand.java:115)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 192.168.99.132, port 1433 has failed. Error: "null. 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 net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.executeConnect(OpenConnectionCommand.java:171)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.access$000(OpenConnectionCommand.java:45)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand$1.run(OpenConnectionCommand.java:104)
    ... 6 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 192.168.99.132, port 1433 has failed. Error: "null. 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 net.sourceforge.squirrel_sql.fw.sql.SQLDriverManager.getConnection(SQLDriverManager.java:133)
    at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.executeConnect(OpenConnectionCommand.java:167)
    ... 8 more
4

2 回答 2

0

从理论上讲,您还需要 jTDS 连接字符串中的实例名称(例如,附加“;instance=SQLEXPRESS”)——但我不熟悉 jTDS,我可能错了,但如果您没有设置它并且您正在连接,那么也许你正在连接到别的东西?

您在上面显示了带有 IP 地址的 jTDS 连接字符串和带有服务器名称“winny”(jdbc:sqlserver://winny\SQLEXPRESS:1433;databaseName=vha) 的 Microsoft 连接字符串——您尝试过 IP 地址吗?(jdbc:sqlserver://192.168.99.132\SQLEXPRESS:1433;databaseName=vha)

我通常尝试的事情:

  1. 验证端口——你可以远程登录到主机上的 localhost 端口 1433
  2. 验证网络——确保主机响应 ping——你能从客户端按名称 ping 它吗?按 IP 地址?
  3. 验证端口 1433 是否打开——您可以从客户端远程登录到端口 1433 上的主机吗?

因为您可以从 Mac 客户端与 jTDS 连接,所以您应该已经能够完成所有这三个操作,但值得仔细检查。

您还可以尝试在服务器上硬编码端口 1433(将其从空白更改)——也许存在另一个 SQL 实例?另请参阅http://support.microsoft.com/kb/287932

以下是我通常会执行的一些步骤,也许这会有所帮助:

  1. (服务器)打开SSMS,右键SQL Server,属性;验证是否选中了允许远程连接。如果没有,请检查并重新启动 SQL Server。
  2. (服务器)打开 SQL Server 配置管理器(开始 -> SQL Server -> 配置工具)
    1. 验证 TCP/IP 是否已启用
    2. 对于默认实例,请验证是否设置了静态端口 1433(注意:命名实例将具有反斜杠,例如 MYSQLSERVER\MYINSTANCE,而默认实例仅使用服务器名称标识。)
    3. 对于命名实例,选择另一个静态端口,例如 1434+,并将其设置为静态端口。每个实例只有一个——不要在同一台机器上重复使用它们。
    4. 重新启动 SQL Server 服务
  3. (服务器)验证你所做的到目前为止是否有效;在 SQL Server 机器上:
    1. 打开CMD提示,“telnet localhost 1433”(根据情况将1433改为其他端口号)
      1. 如果你得到一个“挂起”的空白屏幕,它就起作用了!
      2. 如果你得到一个错误,它没有工作。回到广场 1。
    2. 尝试同样的事情,但使用机器名而不是 localhost
  4. (服务器)配置 Windows 防火墙以将例外添加到 TCP 端口 1433(或您在步骤 2 中选择的任何端口)
  5. (服务器)如​​果使用命名实例,还要向 UDP 端口 1433 添加另一个例外(对于使用 UDP 而不是 TCP 的 SQL Browser 服务 - 还要注意 SQL Browser 服务始终使用端口 1433,即使您为实例选择了不同的 TCP 端口在步骤 2)
  6. (客户端)从同一网络上的另一台机器验证
    1. 打开 CMD 提示,“ping”——如果你得到响应,机器可以互相看到。即使您没有收到响应,请尝试下一步 - 例如,Windows 7 可能默认不回复回显请求 (ping)
    2. 打开CMD提示,“telnet 1433”(根据情况将1433改为其他端口号)
      1. 如果你得到一个“挂起”的空白屏幕,它就起作用了!
      2. 如果你得到一个错误,它没有工作。回到广场 1。
  7. (客户端)现在尝试从另一个应用程序(如 Excel)连接到 SQL Server
  8. (客户端)另见http://blogs.msdn.com/b/dataaccesstechnologies/archive/2010/01/29/testing-connection-to-sql-server-from-a-service-running-under-local-system -account.aspx其他错误
于 2013-01-15T06:04:08.437 回答
-1
    Step 1: Download jtds.jar from http://sourceforge.net/projects/jtds/files/

    Step 2: Add the jar into eclipse or any IDE.

    Step 3: 
    String driver="net.sourceforge.jtds.jdbc.Driver";
    Class.forName(driver).newInstance();

    String connString="jdbc:jtds:sqlserver://127.0.0.1:1433/database_name;encrypt=false;user=sa;password=yourpassword;integratedSecurity=true;instance=SQLEXPRESS;";
    String username="sa";
    String password="yourpassword";
OR
String connString="jdbc:jtds:sqlserver://192.168.1.198:1433/database_name;encrypt=false;user=sa;password=yourpassword;";
        String username="sa";
        String password="yourpassword";
于 2015-04-13T17:55:37.190 回答