Cum să faceți ca Java să funcționeze cu SQL Server? (Programare, Java, Server Sql, Jdbc)

doro a intrebat.

Știu că este o întrebare de bază, dar se pare că nu pot găsi un răspuns și îmi cer scuze, dacă această întrebare este mult prea stupidă, dar iată:

Ar trebui să lucrez cu SQL Server (nicio problemă până acum) și cu Java (iubesc java, deci nicio problemă nici aici), dar acum: Ce ar trebui să fac pentru ca această combinație să funcționeze?Am primit: JRE 1.6 și sqljdbc4.jar … Înainte de a pune sqljdbc4.jar în classpath-ul meu aveam sqljdbc.jar și cu un program de test am primit această excepție:

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)

Îmi pare rău pentru limba germană … Aceasta înseamnă, în esență, că ar trebui să folosesc sqljdbc4.jar, deoarece JRE pe care îl folosesc nu este acceptat de driver. Așa că am pus sqljdbc4.jar în classpath, dar nu a funcționat, așa că nu prea știu ce aș putea face.

Poate că cineva ar putea să-mi spună într-un mod idiot ce ar trebui să fac 🙁

Oh da, aici este aplicația de test pe care o folosesc:

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();
        }
    }
};

9 răspunsuri
oxbow_lakes

Ați încercat aplicația jtds driver pentru SQLServer?

Jesper

Nu puneți atât vechiul sqljdbc.jar, cât și noul sqljdbc4.jar în classpath – acest lucru va face (mai mult sau mai puțin) imprevizibil ce clase sunt utilizate, dacă ambele JAR-uri conțin clase cu aceleași nume calificate.

Ați spus că ați pus sqljdbc4.jar în classpath – ați eliminat vechiul sqljdbc.jar din classpath? Ați spus că „nu a funcționat”, ce înseamnă asta mai exact? Sunteți sigur că nu aveți încă vechiul JAR în classpath undeva (poate nu în mod explicit)?

Comentarii

  • Cred că veți descoperi că va fi favorizat orice jar care se află primul în classpath (cu JVM-ul Sun), deși, de acord, cel mai bine este să includeți doar jar-ul pe care doriți să-l folosiți cu adevărat. –  > Por Nick Holt.
  • Mulțumesc pentru răspuns. Nu m-am făcut înțeles, îmi pare rău, dar da, am eliminat sqljdbc.jar din classpath și am pus sqljdbc4.jar în classpath, dar tot primesc aceeași excepție. Cum pot să văd dacă este încă „not explicitly” în classpath? –  > Por doro.
  • Cu „not explicitly” mă refeream la faptul că poate rulezi codul într-un server (Tomcat, de exemplu) și ai JAR-ul într-un director lib al serverului, sau poate că este chiar în directorul lib/ext al JRE (fișierele JAR de acolo sunt puse automat în classpath). –  > Por Jesper.
pjp

Driverul pe care îl utilizați este driverul MS SQL server 2008 (sqljdbc4.jar). După cum se menționează în pagina MSDN, acesta necesită Java 6+ pentru a funcționa.

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

Biblioteca de clasă sqljdbc4.jar necesită un Java Runtime Environment (JRE) de versiunea 6.0 sau mai recentă.

V-aș sugera să folosiți driverul 2005 care cred că se află în (sqljdbc.jar) sau, așa cum spune Oxbow_Lakes, încercați driverul jTDS (http://jtds.sourceforge.net/).

Bart de Kort

Poate că este puțin cam târziu, dar folosirea unor drivere diferite cu totul este exagerată pentru un caz de eroare de utilizator:

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

ar trebui să fie oricare dintre acestea:

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

(folosind named pipe) sau:

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

folosind direct numărul de port; puteți omite 1433, deoarece este portul implicit, lăsând:

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

Andrew McDonald

Pentru cei care încă mai caută pe Google, mergeți la blackboardconfigtomcatconf și în wrapper.conf puneți o linie suplimentară în wrapper.java.classpath care să arate spre sqljdbc4.jar și apoi actualizați și wrapper.conf.bb

Apoi reporniți serviciile blackboard și tomcat și ar trebui să funcționeze.

Nu va funcționa prin simpla setare a classpath-ului java, trebuie să îl configurați în fișierele de configurare blackboard pentru a indica fișierul jar cu biblioteca jdbc.

Jorge Sanchez

Am avut aceeași problemă cu un client al companiei mele, problema a fost că driverul sqljdbc4.jar, încearcă o conversie de caractere între baza de date și driver. De fiecare dată când făcea o cerere către baza de date, acum vă puteți imagina 650 de conexiuni concomitent, acest lucru a făcut ca sistemul meu să fie foarte, foarte lent, pentru a evita această situație am adăugat la String of connection următorul parametru:

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

După aceasta, sistemul este foarte rapid, iar utilizatorii sunt foarte mulțumiți de această schimbare, sper ca și contribuția mea să fie la fel.

Comentarii

  • Folosesc sqljdbc4.jar jre1.6_29 –  > Por Jorge Sanchez.
Pedro Guimrães

Într-adevăr. Chestia este că versiunea 2008 R2 este foarte complicată. Driverul JTDs pare să funcționeze în unele cazuri. Pe un anumit server, jTDS a funcționat bine pentru o instanță 2008 R2. Într-un alt server, însă, a trebuit să folosesc driverul JBDC al Microsoft sqljdbc4.jar. Dar atunci, ar funcționa numai după ce se stabilea mediul JRE la 1.6 (sau mai mare).

Am folosit 1.5 pentru celălalt server, așa că am pierdut mult timp cu acest lucru.

Problemă complicată.

anandan

Dacă utilizați sqljdbc4.jar, utilizați următorul cod

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;

lutz

Comentarii

  • Nu vă apropiați de el, intenționat sau nu, este destul de slab sau a fost ultima dată când l-am folosit – teoreticianul conspirației din mine ar putea spune că este intenționat, dar bănuiesc că pur și simplu nu i-au dedicat suficiente resurse… –  > Por Nick Holt.