如何使 Java 与 SQL Server 一起工作?

Posted

技术标签:

【中文标题】如何使 Java 与 SQL Server 一起工作?【英文标题】:How to make Java work with SQL Server? 【发布时间】:2010-11-21 14:02:21 【问题描述】:

我知道这是一个基本问题,但我似乎找不到答案,如果这个问题太愚蠢,我很抱歉,但我们开始吧:

我应该使用 SQL Server(到目前为止没有问题)和 Java(喜欢 java,所以这里也没有问题),但是现在:我应该怎么做才能使组合工作? 我得到了: JRE 1.6sqljdbc4.jar ...在我将 sqljdbc4.jar 放入我的类路径之前,我有 sqljdbc.jar 并带有一个测试程序我得到了这个例外:

21.08.2009 09:26:59 com.microsoft.sqlserver.jdbc.SQLServerConnection <init>
SCHWERWIEGEND: Die Java-Laufzeitumgebung (Java Runtime Environment, JRE), Version 1.6,
wird von diesem Treiber nicht unterstützt. Verwenden Sie die Klassenbibliothek 
'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.
java.lang.UnsupportedOperationException: Die Java-Laufzeitumgebung (Java Runtime 
Environment, JRE), Version 1.6, wird von diesem Treiber nicht unterstützt. Verwenden 
Sie die Klassenbibliothek 'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.<init>(SQLServerConnection.java:223)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:840)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at msSqlTest.DB.dbConnect(DB.java:13)
    at msSqlTest.TestConnection.main(TestConnection.java:7)

对不起德国人......这基本上意味着我应该使用 sqljdbc4.jar,b/c 我正在使用的 JRE 不受驱动程序支持。所以我把 sqljdbc4.jar 放到了我的类路径中,但它没有用,所以我有点迷茫,我能做什么。

也许有人会以一种白痴的方式告诉我应该做什么:(

哦,是的,这是我使用的测试应用程序:

import java.sql.*;

public class TestConnection
    public static void main(String[] args)
        // Neue DB und los geht's :)
        DB db = new DB();
        db.dbConnect("jdbc:sqlserver://localhost:1433/muff", "user", "pw" );
    


class DB
    public void dbConnect(  String db_connect_string, 
                            String db_userid, 
                            String db_password)
        try
        Class.forName( "com.microsoft.sqlserver.jdbc.SQLServerDriver" );
            Connection conn = DriverManager.getConnection(
                            db_connect_string, 
                        db_userid, 
                        db_password);
            System.out.println( "connected" );
        
        catch( Exception e )
            e.printStackTrace();
        
    
;

【问题讨论】:

【参考方案1】:

您是否尝试过用于 SQLServer 的 jtds 驱动程序?

【讨论】:

【参考方案2】:

不要将旧的 sqljdbc.jar 和新的 sqljdbc4.jar 都放在类路径中 - 如果这两个 JAR 包含具有相同限定名的类,这将(或多或少)不可预测正在使用哪些类.

您说您将 sqljdbc4.jar 放在类路径中 - 您是否从类路径中删除了旧的 sqljdbc.jar?您说“它不起作用”,这到底是什么意思?你确定你的类路径中的某个地方(可能没有明确地)仍然没有旧的 JAR 吗?

【讨论】:

我想你会发现无论哪个 jar 首先在类路径中都会受到青睐(使用 Sun JVM),尽管同意,但最好只包含你真正想要使用的 jar。跨度> 谢谢回复。我没有说清楚,对不起,但是是的,我确实从类路径中删除了 sqljdbc.jar 并将 sqljdbc4.jar 放入类路径中,但我仍然得到同样的异常。如何在类路径中查看它是否仍然“未明确”? 使用“未明确”,我的意思是您可能正在服务器中运行代码(例如 Tomcat),并且您在服务器的 lib 目录中有 JAR,或者它甚至在您的 lib 中JRE 的 /ext 目录(其中的 JAR 文件会自动放入类路径中)。【参考方案3】:

您使用的驱动程序是 MS SQL server 2008 驱动程序 (sqljdbc4.jar)。如 MSDN 页面所述,它需要 Java 6+ 才能工作。

http://msdn.microsoft.com/en-us/library/ms378526.aspx

sqljdbc4.jar 类库需要一个 Java 运行时环境 (JRE) 的 6.0 或更高版本。

我建议使用我认为在 (sqljdbc.jar) 中的 2005 驱动程序,或者按照 Oxbow_Lakes 的说法尝试 jTDS 驱动程序 (http://jtds.sourceforge.net/)。

【讨论】:

【参考方案4】:

可能有点晚了,但是对于用户错误的情况,完全使用不同的驱动程序是多余的:

db.dbConnect("jdbc:sqlserver://localhost:1433/muff", "user", "pw" );

应该是以下之一:

db.dbConnect("jdbc:sqlserver://localhost\muff", "user", "pw" );

(使用命名管道)或:

db.dbConnect("jdbc:sqlserver://localhost:1433", "user", "pw" );

直接使用端口号;你可以忽略 1433 因为它是默认端口,离开:

db.dbConnect("jdbc:sqlserver://localhost", "user", "pw" );

【讨论】:

【参考方案5】:

对于仍在谷歌搜索的任何人,请转到 \blackboard\config\tomcat\conf 并在 wrapper.conf 中在 wrapper.java.classpath 中添加一个指向 sqljdbc4.jar 的额外行,然后将 wrapper.conf.bb 更新为好吧

然后重启黑板服务和tomcat就可以了

通过简单地设置你的java类路径是行不通的,你必须在黑板配置文件中设置它以使用jdbc库指向你的jar文件

【讨论】:

【参考方案6】:

我公司的一个客户遇到了同样的问题,问题是驱动程序 sqljdbc4.jar 尝试在数据库和驱动程序之间进行字符转换。每次它向数据库发出请求时,现在你可以想象同时有 650 个连接,这让我的系统非常慢,为了避免这种情况,我在连接字符串中添加了以下参数:

 SendStringParametersAsUnicode=false, then te connection must be something like url="jdbc:sqlserver://IP:PORT;DatabaseName=DBNAME;SendStringParametersAsUnicode=false"

之后,系统非常非常快,因为用户对更改非常满意,我希望我的输入是一样的。

【讨论】:

我正在使用 sqljdbc4.jar jre1.6_29【参考方案7】:

确实如此。问题是 2008 R2 版本非常棘手。 JTDs 驱动程序似乎适用于某些情况。在某台服务器中,jTDS 对于 2008 R2 实例运行良好。但是,在另一台服务器上,我不得不使用 Microsoft 的 JBDC 驱动程序 sqljdbc4.jar。但是,它只有在将 JRE 环境设置为 1.6(或更高)后才能工作。

我在其他服务器上使用了 1.5,所以我在这方面花了很多时间。

棘手的问题。

【讨论】:

【参考方案8】:

如果你使用的是sqljdbc4.jar,请使用以下代码

ResultSet objResultSet = objPreparedStatement.getResultSet();
if (objResultSet == null) 
  boolean bResult = false;
  while (!bResult)
    if (objPreparedStatement.getMoreResults())
      objResultSet = objPreparedStatement.getResultSet();
      bResult = true;
    
   

objCachedRowSet = new CachedRowSetImpl();
objCachedRowSet.populate(objResultSet);
if (CommonUtility.isValidObject(objResultSet)) objResultSet.close();
objResultSet = null;

【讨论】:

【参考方案9】:

the official JDBC 4.0 compatible JDBC driver from Microsoft 呢?

【讨论】:

不要靠近它,不管是有意还是无意,它很差,或者是我最后一次使用它——我心中的阴谋论者可能会说这是故意的,但我怀疑他们只是没有投入足够的资源给它...

以上是关于如何使 Java 与 SQL Server 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章