如何使 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.6 和 sqljdbc4.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 一起工作?
如何在 Sql Server Compact Edition 中将参数与 LIKE 一起使用
如何让实体数据模型与 SQL Server CE 4.0 一起使用?