0

我正在尝试通过使用 jdbc 的 jtds1.2.jar 实现并在其上运行存储过程来连接到 sqlServer 2008。 我写了一个测试应用程序,它成功地做到了

我在自己的环境(不是应用程序服务器环境)中这样做有问题。我正在使用 java 1.4。我将我的类路径设置为首先查看 jtds。调用方法 DriverManager.getConnection... 时,源代码不是 jtds 源代码。这是我的代码(与示例中的代码相同):

Class.forName("net.sourceforge.jtds.jdbc.Driver");
String url = "jdbc:jtds:sqlserver://" + serverIP + ":" + port + "/" + serviceName;
java.util.Enumeration myEnum = DriverManager.getDrivers();
Connection connection = DriverManager.getConnection(url,userName,password);

在调试中:myEnum 有 2 个驱动程序:

  1. sun.jdbc.odbc.jdbcodbcdriver

  2. jtds 驱动程序

我很害怕 DriverManger 加载了第一个。

如何确保加载 jtds 驱动程序?

非常感谢

4

1 回答 1

0

老实说,当您明确指定它应该使用 jTDS 驱动程序时,我真的不明白为什么 DriverManager 会尝试使用 JDBC-ODBC 桥驱动程序。连接 URL 的第二部分是jtds告诉 DriverManager 使用 jTDS 驱动程序。是什么让您如此确定 DriverManager 加载了 JDBC-ODBC 桥驱动程序?

在我的系统上,我还在 enumeration 中看到了相同的两个条目DriverManager.getDrivers()。但是,仅仅因为 JDBC-ODBC 桥驱动程序在此列表中排在首位,并且您可以想象通过它连接到 SQL Server,并不意味着 DriverManager 会选择它。您要求 jTDS 驱动程序,它会使用它或根本不使用。

如果您故意在调用中输入错误的用户名和密码会发生什么getConnection?当我这样做时,我得到了一个堆栈跟踪,它清楚地表明它正在使用 jTDS:

java.sql.SQLException:用户“x”登录失败。
        在 net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
        在 net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
        在 net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
        在 net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:603)
        在 net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:345)
        在 net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
        在 net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
        在 java.sql.DriverManager.getConnection(DriverManager.java:582)
        在 java.sql.DriverManager.getConnection(DriverManager.java:185)
        ...

编辑:在您的评论中,您写道:

调试getconnection方法时src代码与jtds1.2源码不匹配

我不完全确定您在这里的意思,但我猜您正在使用调试器单步执行代码,并且当您尝试单步执行该getConnection方法时,调试器不会跳转到 jTDS 源代码。通常,调试器不会自动获取 JAR 的源代码——您必须将源代码“附加”到调试器。确切地说,您如何执行此操作取决于您使用的调试器。

但是,我不确定您为什么要进入该getConnection方法。我猜您在连接数据库时遇到了一些困难。您确定所有数据库连接详细信息都正确吗?您可以使用其他程序(例如 SQL Server Management Studio)连接到数据库吗?

最后,(这是一个完整的猜测,但我之前也遇到过同样的问题),您是否尝试连接到 SQL Server 的 Express 版本?如果是这样,您需要在数据库上启用 TCP/IP 连接。JDBC 使用 TCP/IP 连接来连接到 SQL Server,在 Express 版本中,这些连接默认被禁用。有关如何执行此操作的说明, 请参阅http://softwaresalariman.blogspot.com/2007/04/jdbc-to-sql-server-express.html 。

于 2011-02-04T23:09:05.227 回答