如何使 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 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 SQL Server 2012 与 php 一起工作?

如何使标准输出与并行 Python 一起使用?

如何在 Sql Server Compact Edition 中将参数与 LIKE 一起使用

如何让实体数据模型与 SQL Server CE 4.0 一起使用?

如何将 SQL Server Compact 3.5 与实体框架一起使用

如何将 Debezium SQL Server 连接器与 ksqlDB 嵌入式连接一起使用?