如何生成JDBC数据库URL?

时间:2014-07-01 18:31:28

标签: java sql-server database jdbc

我今天已经研究了大约3个小时,我觉得我很接近,但我有几个问题。到目前为止,我发现的最佳信息来源是:https://stackoverflow.com/a/2840358,但它并未回答我的所有问题。

一点背景:我使用的是Microsoft SQL Server 2014,并且我已经验证了IP地址127.0.0.1是否处于活动状态并使用端口1433启用。我通过SQL Server程序连接到数据库没有问题同一台机器,但我正在尝试通过我正在编写的Java程序进行连接,并且它当前正在发出此错误:com.microsoft.sqlserver.jdbc.SQLServerException:端口号1433 / R2M_Database无效。我对此感到困惑,因为我知道端口1433是正确的,我知道我要连接的数据库叫做R2M_Database。现在,这是我的问题以及我的源代码。

1。)“mysql”和“sqlserver”子协议之间有什么区别,我怎么知道使用哪个? (我很确定我应该使用sqlserver,但以防万一)

2.。)我如何确保使用正确的主机名? (我很确定127.0.0.1 / localhost是我应该使用的那个,但是我怎样才能从其他机器运行这个程序来访问数据库?)

3。)是否存在可能导致防火墙或密码要求的外部问题? (我相当确定用户名和密码是正确的,因为它们是我用来在Microsoft SQL Server 2014中成功获得连接的那些)

编辑:

import java.sql.DriverManager;
import java.io.BufferedReader;
import java.io.FileReader;
import org.apache.ibatis.jdbc.ScriptRunner;

public class SQLTest {
    public static void main(String[] args){
        String script = "CreatePersons.sql";
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            new ScriptRunner(DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=R2M_Database", userName, password))
                    .runScript(new BufferedReader(new FileReader(script)));
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

我做了一个轻微的语法更改(; databaseName =而不是/),现在我收到此错误:

com.microsoft.sqlserver.jdbc.SQLServerException:用户'RSquaredMacro'登录失败。 ClientConnectionId:35281a40-0f87-42e4-BC46-b9a81a371529

2 个答案:

答案 0 :(得分:2)

  1. mysql是一个完全不同的数据库服务器。不要将它用于SQL Server。

  2. 您需要为数据库服务器提供公共地址。只要所有客户都可以看到它,就可以使用ip或主机名。如果你没有,你可以尝试使用dyndns.org或类似的东西。请注意,您的客户仍需要能够访问网络上的服务器(潜在的防火墙问题)。如果不了解你的情况,很难说更多。

  3. 防火墙可能是一个问题,但对于localhost来说这不太可能。我猜测问题在于TCP / IP侦听器,用户名,密码或数据库名称设置。

  4. 这是一个链接,其中包含有关构建JDBC连接字符串的更多信息:http://technet.microsoft.com/en-us/library/ms378428%28v=sql.110%29.aspx

    还有一些旁注:

    1. 您不需要包含1433端口号。

    2. 打印整个堆栈跟踪将帮助您进行调试。 (见下面的代码)

    3. 您应该为Connection声明一个变量并确保 它被关闭了。例如:

      Connection c = null;
      try {
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
          c = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433/R2M_Database", userName, password);
          new ScriptRunner(c).runScript(new BufferedReader(new FileReader(script)));
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          if (c != null) try { c.close(); } catch (Exception e) { }
      }
      

答案 1 :(得分:0)

事实证明,问题在于我的JDBC URL的格式化。我遇到的问题是不同的子协议具有不同的URL-s语法,但sqlserver协议的语法(以及如何查找每个部分)如下所示:

"jdbc:sqlserver://" + serverName + ";database=" + databaseName

1。)serverName:要查找服务器名称,请连接到Microsoft SQL Server(这些说明基于SQL Server 2014),然后查看右侧的“属性”窗格。在顶部的组合框中选择“当前连接参数”,然后在“服务器名称”字段的“连接详细信息”下查找。

2。)databaseName:这个是相当简单的,因为它是您要从中访问数据的数据库的名称。即使您登录的用户列在“主”数据库下,您也不必登录“master”,而是可以使用您想要的任何数据库,只要您登录的用户具有权限即可完成你想要完成的任务。

最后:这是帮助我最终解决问题的链接,更详细地说:http://www.programcreek.com/2010/05/java-code-for-connecting-ms-sql-server-by-using-sql-server-authentication/