28

我正在学习 Java,需要运行一些简单的东西来通过 JDBC 从 MSSQL 中检索一些数据。我书中的例子不起作用(但它已经有好几年了),下面这个来自 MS 的例子对我也不起作用:

http://msdn.microsoft.com/en-us/library/ms378956(v=sql.90).aspx

这是我的代码:

package javasql;
import java.sql.*;
import java.util.*;

public class Program {

    private static String url = "jdbc:sqlserver://localhost\\SQLExpress;database=Northwind;integratedSecurity=true;";
    //private static String userName = "sa";
    //private static String password = "myPassword";

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        RunDemo();
    }

    public static void RunDemo() {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection connection = DriverManager.getConnection(url);

            Statement statement = connection.createStatement();
            ResultSet results = statement.executeQuery("SELECT ProductName, Price FROM Products ORDER BY ProductName");

            while(results.next()) {
                System.out.println("Product Name: " + results.getNString("ProductName") + " Price: $" + results.getFloat("UnitPrice"));
            }

        } catch (ClassNotFoundException | SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

当我运行代码时,我没有抛出任何异常。我只是在输出窗口中得到这个:

run:
com.microsoft.sqlserver.jdbc.SQLServerDriver
BUILD SUCCESSFUL (total time: 0 seconds)

我正在使用 NetBeans 7.2。请有人给我一个工作示例。

编辑:

顺便说一句,对于您看到的连接字符串,\\SQLExpress我确实尝试删除它并instanceName=SQLExpress改为使用..但这也没有任何效果。

编辑2:

好的,我从 MS 下载了最新的 MSSQL JDBC 驱动程序,并在其中引用了 2 个 JAR 文件。现在我得到这个输出:

run:
The connection to the host localhost, named instance SQLExpress failed. 

Error: "java.net.SocketTimeoutException: Receive timed out". 

Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434.  
For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the host.
BUILD SUCCESSFUL (total time: 15 seconds)

进展..至少我们可以看到它现在正在尝试连接,但是有人可以告诉我上述错误吗?

编辑 3:

修复了另外 2 个问题.. 一个是启用 SQL Server Browser,第二个是为 SQL Server 启用 TCP/IP。谢谢@Vikdor 现在我收到此错误:

run:
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.".
BUILD SUCCESSFUL (total time: 15 seconds)

我检查了 Windows 防火墙并添加了一个入站规则以允许该端口,但我仍然收到上述错误。有任何想法吗?

编辑4:

尝试了此链接中的解决方案:http: //www.coderanch.com/t/306316/JDBC/databases/SQLServerException-TCP-IP-connection-host

在 EDIT 3 中不再出现错误。现在得到另一个...

run:
Sep 21, 2012 11:33:16 AM com.microsoft.sqlserver.jdbc.AuthenticationJNI <clinit>
WARNING: Failed to load the sqljdbc_auth.dll cause : no sqljdbc_auth in java.library.path
This driver is not configured for integrated authentication. ClientConnectionId:577f359e-4774-45f3-96fb-588785911817
BUILD SUCCESSFUL (total time: 14 seconds)

现在对此感到非常厌倦..为什么是Java,为什么?说真的……我很高兴我主要使用 .NET。好吧,当我找到解决方案时,我会在此处发布它以确保它可以在其他人发疯之前帮助他们,因为我即将...

编辑 5:

这有帮助: java 连接到 MicrosoftSQLServer 2005

我将目录路径放入我的 PATH 环境变量中。没用,所以我也把它sqljdbc_auth.dll放到了我的 JDK 文件夹C:\Program Files\Java\jdk1.7.0_04\bin中。解决了。

4

8 回答 8

42

好的,这就是解决我的问题的方法:

  1. 从这里下载最新的 MSSQL JDBC 驱动程序:http: //msdn.microsoft.com/en-us/sqlserver/aa937724.aspx

  2. 在我的项目中引用了 2 个 JAR 文件: sqljdbc.jarsqljdbc4.jar(我还不确定是以上两个都需要还是只需要一个..)

  3. 确保 SQL Server Browser windows 服务正在运行

  4. 打开 SQL Server 配置管理器并转到SQL Server 网络配置的 SQLEXPRESS 协议。右键单击TCP/IP并选择属性。设置启用= 是。

  5. 当您在那里时,单击IP 地址选项卡并找到IP All部分。将TCP 端口设置为 1433。

  6. sqljdbc_auth.dll添加到您的PATH 环境变量中。在我的情况下:D:\Java\sqljdbc_4.0\enu\auth\x64

  7. sqljdbc_auth.dll复制到您的JDK 目录。就我而言:C:\Program Files\Java\jdk1.7.0_04\bin

我希望这可以帮助别人。

于 2012-09-21T05:07:51.337 回答
16

谢谢 最后它的工作。如果以下消息显示为错误,

 Verify the server and instance names and check that no firewall is blocking
 UDP traffic to port 1434. For SQL Server 2005 or later,
 verify that the SQL Server Browser Service is running on the host

请通过以下方式启用 Sql Server Browser,

开始>控制面板>系统和安全>管理工具>服务

选择SQL Server Browser右键单击​​并选择属性

将启动类型设置为自动。单击应用>单击开始>单击确定

确保您的 IPALL TCP 地址是 - 1433

于 2014-07-17T14:01:31.580 回答
4

您可能需要检查我在此处列出的步骤:错误:与主机的 TCP/IP 连接失败。java.net.ConnectException: Connection refused: connect看看SQLExpress实例配置是否正确,然后修改你的JDBC URL,单独指定实例名称。该示例用于基于密码的身份验证,但适用于您的integratedSecurity=true;财产。

于 2012-09-21T03:55:58.177 回答
3

原因:

  1. 协议 (TCP/IP) 未启用
  2. 端口不正确
  3. 缺少 sqljdbc_auth.dll
于 2013-11-25T03:48:07.190 回答
3

在我的情况下:我没有在 URL 字符串中添加端口号

String url = "jdbc:sqlserver://ABC\\SQLEXPRESS;databaseName=xyz;portNumber=1433"

它解决了我的问题

于 2018-10-04T21:32:18.460 回答
2

命名和多个 SQL Server 实例

如果您需要从 uni* 连接到命名实例,请在构建JDBC 连接 URL时特别注意

如果同时使用 portNumber 和 instanceName,则 portNumber 将优先,instanceName 将被忽略。

这也意味着如果要使用实例名称,您不能更改端口号。

在任何这些行中,参数myinstancename将被忽略:

  • jdbc:sqlserver://db-devmyinstancename;databaseName=mydbname;portNumber=1433
  • jdbc:sqlserver://db-dev;databaseName=dbname;instanceName=myinstancename;portNumber=1433
  • jdbc:sqlserver://db-dev\myinstancename:1433;databaseName=mydbname
  • jdbc:sqlserver://db-dev:1433;databaseName=dbname;instanceName=myinstancename

因此,如果您想使用实例名称,则必须删除端口号(尝试使用 jdbc sqlserver 驱动程序版本 3、4、4.1)

于 2014-12-29T13:37:10.483 回答
2

请通过以下方式启用 Sql Server Browser,开始 > 控制面板 > 系统和安全 > 管理工具 > 服务 选择 SQL Server Browser 右键单击​​并选择属性。

将启动类型设置为自动。单击应用>单击开始>单击确定

确保您的 IPALL TCP 地址是 - 1433!

于 2017-04-23T18:33:48.263 回答
1

这可能很愚蠢,但请检查您的 Products 表是否为空。这是我看到没有出现任何异常并且没有在控制台中打印任何内容的唯一原因。

于 2012-09-21T03:43:54.163 回答