61

我的 sql 服务器实例名称是 MYPC\SQLEXPRESS,我正在尝试创建一个 jTDS 连接字符串来连接到数据库“博客”。任何人都可以帮我完成吗?

我正在尝试这样做:

DriverManager.getConnection("jdbc:jtds:sqlserver://127.0.0.1:1433/Blog", "user", "password");

我明白了:

 java.sql.SQLException: Network error IOException: Connection refused: connect
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:395)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at SqlConnection.Connect(SqlConnection.java:19)
    at main.main(main.java:11)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:305)
    at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:255)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:323)
    ... 6 more
4

5 回答 5

122

如 jTDS Frequenlty Asked Questions中详述,jTDS的 URL 格式为:

jdbc:jtds:<server_type>://<server>[:<port>][/<database>][;<property>=<value>[;...]]

因此,要连接到由运行在 上的 MS SQL Server 托管的名为“Blog”的数据库MYPC,您可能会得到如下结果:

jdbc:jtds:sqlserver://MYPC:1433/Blog;instance=SQLEXPRESS;user=sa;password=s3cr3t

或者,如果您更喜欢使用getConnection(url, "sa", "s3cr3t")

jdbc:jtds:sqlserver://MYPC:1433/Blog;instance=SQLEXPRESS

编辑:关于您的Connection refused错误,请仔细检查您是否在端口 1433 上运行 SQL Server,该服务正在运行并且您没有阻止传入连接的防火墙。

于 2009-12-07T20:01:22.680 回答
43

真的,真的,真的检查你的本地 SQLEXPRESS 实例中是否启用了 TCP/IP 协议。

请按照以下步骤确保:

  • 在“开始菜单\程序\Microsoft SQL Server 2012\Configuration Tools\”中打开“ Sql Server 配置管理器
  • 展开“SQL Server 网络配置”
  • 进入“SQLEXPRESS 协议”
  • 启用 TCP/IP

如果您有任何问题,请查看此博客文章了解详细信息,因为它包含屏幕截图和更多信息。

还要检查“SQL Server Browser”窗口服务是否已激活并正在运行

  • 转到控制面板 -> 管理工具 -> 服务
  • 打开“SQL Server Browser”服务并启用它(手动或自动,取决于您的需要)
  • 启动它。

就是这样。

在我安装了一个全新的本地 SQLExpress 后,我所要做的就是启用 TCP/IP 并启动 SQL Server Browser 服务。

下面是我用来测试 SQLEXPRESS 本地连接的代码。当然,您应该根据需要更改 IP、DatabaseName 和用户/密码。:

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JtdsSqlExpressInstanceConnect {
    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        ResultSet rs = null;
        String url = "jdbc:jtds:sqlserver://127.0.0.1;instance=SQLEXPRESS;DatabaseName=master";
        String driver = "net.sourceforge.jtds.jdbc.Driver";
        String userName = "user";
        String password = "password";
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, userName, password);
            System.out.println("Connected to the database!!! Getting table list...");
            DatabaseMetaData dbm = conn.getMetaData();
            rs = dbm.getTables(null, null, "%", new String[] { "TABLE" });
            while (rs.next()) { System.out.println(rs.getString("TABLE_NAME")); }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            conn.close();
            rs.close();
        }
    }
}

如果您使用 Maven,请将其添加到您的 pom.xml:

<dependency>
    <groupId>net.sourceforge.jtds</groupId>
    <artifactId>jtds</artifactId>
    <version>1.2.4</version>
</dependency>
于 2013-03-15T12:40:07.677 回答
9

jdbc:jtds:sqlserver://x.x.x.x/database替换x.x.x.x为 SQL Server 计算机的 IP 或主机名。

jdbc:jtds:sqlserver://MYPC/Blog;instance=SQLEXPRESS

或者

jdbc:jtds:sqlserver://MYPC:1433/Blog;instance=SQLEXPRESS

如果您也想在连接字符串中设置用户名和密码,而不是单独针对连接对象:

jdbc:jtds:sqlserver://MYPC/Blog;instance=SQLEXPRESS;user=foo;password=bar

(更新了我的错误信息并添加了对实例语法的引用)

于 2009-12-07T19:29:46.927 回答
4

黑暗中的一枪,但从您的错误消息的外观来看,似乎 sqlserver 实例未在端口 1433 上运行,或者某些东西阻止了对该端口的请求

于 2009-12-07T20:05:10.583 回答
-1

SQLServer 通过端口 1433 运行默认实例。如果将端口指定为端口 1433,SQLServer 将只查找默认实例。默认实例的名称是在安装时创建的,通常是SQLEXPRESSxxx_xx_ENU

实例名称还与在 Program Files -> Microsoft SQL Server 中创建的文件夹名称相匹配。因此,如果您查看那里并看到一个名为 SQLEXPRESSxxx_xx_ENU 的文件夹,它就是默认实例。

名为MSSQL12.myInstanceName(对于 SQLServer 2012)的文件夹是 SQL Server 中的命名实例,不能通过端口 1433 访问。

因此,如果您的程序正在访问数据库中的默认实例,请指定端口 1433,您可能不需要指定实例名称。

如果您的程序正在访问数据库中的命名实例(不是默认实例),请不要指定端口,但您必须指定实例名称。

我希望这可以澄清上述错误引起的一些混乱。

于 2015-05-07T21:44:42.870 回答