【问题标题】:How to make Java work with SQL Server?如何使 Java 与 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();
        }
    }
};

【问题讨论】:

    标签: java sql-server jdbc


    【解决方案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】:

                【讨论】:

                • 不要靠近它,不管是有意还是无意,它很差,或者是我最后一次使用它——我心中的阴谋论者可能会说这是故意的,但我怀疑他们只是没有投入足够的资源给它...
                猜你喜欢
                • 2015-06-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-11-22
                • 1970-01-01
                • 1970-01-01
                • 2014-12-11
                • 1970-01-01
                相关资源
                最近更新 更多