JDBC没有连接到webservice中的DB

时间:2014-08-01 15:37:52

标签: java sql eclipse web-services jdbc

我一直在使用JDBC。下面是我用来获取连接的代码。

JDBC代码:

    Connection con = null;
    Statement st = null;
    final String DB_URL = "jdbc:jtds:sqlserver://00.00.00.00:0000/DB";
    // Database credentials
    final String USER = "usrname";
    final String PASS = "pw";

    try {   
       Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
       con = DriverManager.getConnection(DB_URL, USER, PASS);
       st = con.createStatement();

       System.out.println("successfully connected!");
    } catch (Exception err) {
       System.out.println(" " + err.getMessage ());
    }
    finally {
       try {
          con.close();
       } catch (Exception e) { /* ignored */ }
          try { 
             st.close(); 
          } catch (Exception e) { 
             /* ignored */ 
          }
       }
    }
}

我已经从包含getter和setter的WSDL生成了一个Webservice。虽然它位于Webservice(它自己的类)的同一个包中,但我可以简单地运行该类,它将生成"Successfully connected"。 (请记住,构建是相同的,因为它在同一个包中)现在当我将代码插入Webservice上的方法并使用insert();调用它时。从这里开始,我使用生成的客户端调用Webservice。回头看一下控制台时,我得到"com.microsoft.sqlserver.jdbc.SQLServerDriver"错误。通常在路径构建不正确时给出。

它在getter和setter类之外工作,但为什么不在里面呢?

3 个答案:

答案 0 :(得分:3)

我试图同步完整的文档。它将涵盖

  1. 各种数据库连接方式
  2. 测试连接的示例代码
  3. 常见错误以及我们如何解决这些问题
  4. 定义JRE支持
  5. 如何设置CLASSPATH变量?
  6. 如何注册驱动程序?
  7. 如何传递连接网址?
  8. 选择正确的JAR文件
  9. 与数据库建立简单连接
  10. 安装JDBC的Microsoft SQL Server 2000驱动程序后,可以通过两种方式完成数据库连接:

    1)使用连接网址,或

    2)使用JNDI数据源

    测试连接的示例代码

    以下示例代码尝试连接到数据库并显示数据库名称,版本和可用目录。将服务器属性替换为服务器的值:

    import java.*;
    public class Connect{
         private java.sql.Connection  con = null;
         private final String url = "jdbc:microsoft:sqlserver://";
         private final String serverName= "localhost";
         private final String portNumber = "1433";
         private final String databaseName= "pubs";
         private final String userName = "user";
         private final String password = "password";
         // Informs the driver to use server a side-cursor, 
         // which permits more than one active statement 
         // on a connection.
         private final String selectMethod = "cursor"; 
    
         // Constructor
         public Connect(){}
    
         private String getConnectionUrl(){
              return url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";";
         }
    
         private java.sql.Connection getConnection(){
              try{
                   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
                   con = java.sql.DriverManager.getConnection(getConnectionUrl(),userName,password);
                   if(con!=null) System.out.println("Connection Successful!");
              }catch(Exception e){
                   e.printStackTrace();
                   System.out.println("Error Trace in getConnection() : " + e.getMessage());
             }
              return con;
          }
    
         /*
              Display the driver properties, database details 
         */ 
    
         public void displayDbProperties(){
              java.sql.DatabaseMetaData dm = null;
              java.sql.ResultSet rs = null;
              try{
                   con= this.getConnection();
                   if(con!=null){
                        dm = con.getMetaData();
                        System.out.println("Driver Information");
                        System.out.println("\tDriver Name: "+ dm.getDriverName());
                        System.out.println("\tDriver Version: "+ dm.getDriverVersion ());
                        System.out.println("\nDatabase Information ");
                        System.out.println("\tDatabase Name: "+ dm.getDatabaseProductName());
                        System.out.println("\tDatabase Version: "+ dm.getDatabaseProductVersion());
                        System.out.println("Avalilable Catalogs ");
                        rs = dm.getCatalogs();
                        while(rs.next()){
                             System.out.println("\tcatalog: "+ rs.getString(1));
                        } 
                        rs.close();
                        rs = null;
                        closeConnection();
                   }else System.out.println("Error: No active Connection");
              }catch(Exception e){
                   e.printStackTrace();
              }
              dm=null;
         }     
    
         private void closeConnection(){
              try{
                   if(con!=null)
                        con.close();
                   con=null;
              }catch(Exception e){
                   e.printStackTrace();
              }
         }
         public static void main(String[] args) throws Exception
           {
              Connect myDbTest = new Connect();
              myDbTest.displayDbProperties();
           }
    }
    

    如果此代码成功,则输出类似于以下内容:

    Connection Successful! Driver Information
            Driver Name: SQLServer
            Driver Version: 2.2.0022
    
    Database Information
            Database Name: Microsoft SQL Server
            Database Version: Microsoft SQL Server  2000 - 8.00.384 (Intel X86)
            May 23 2001 00:02:52
            Copyright (c) 1988-2000 Microsoft Corporation
            Desktop Engine on Windows NT 5.1 (Build 2600: )
    
    Avalilable Catalogs
            catalog: master
            catalog: msdb
            catalog: pubs
            catalog: tempdb
    

    基本连接故障排除

    错误-1

    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Login failed for user 'user'. Reason: Not associated with a trusted SQL Server connection.
    

    <强>答:

      

    如果是SQL Server 2000身份验证模式,则会出现此错误消息   设置为Windows身份验证模式。 Microsoft SQL Server 2000   JDBC驱动程序不支持使用Windows NT进行连接   认证。您必须设置SQL的身份验证模式   服务器到混合模式,允许Windows身份验证和   SQL Server身份验证。

    错误-2

    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]This version of the JDBC driver only supports Microsoft SQL Server 2000. You can either upgrade to SQL Server 2000 or possibly locate another version of the driver.
    

    <强>答:

      

    尝试连接到SQL Server版本时会出现此错误消息   早于SQL Server 2000. Microsoft SQL Server 2000驱动程序   JDBC仅支持与SQL Server 2000的连接。

    Java运行时环境要求

    1. 从用于SQL Server的Microsoft JDBC驱动程序4.2开始,Sun Java SE开发工具包(JDK)8.0和Java运行时环境(JRE)8.0 得到支持。支持Java数据库连接(JDBC)规范 API已扩展为包含JDBC 4.1和4.2 API。
    2. 从用于SQL Server的Microsoft JDBC驱动程序4.1开始,Sun Java SE Development Kit(JDK)7.0和Java Runtime Environment(JRE)7.0 得到支持。
    3. 从用于SQL Server的Microsoft JDBC Driver 4.0开始,JDBC 驱动程序支持Java数据库连接(JDBC)Spec API 已扩展为包含JDBC 4.0 API。 JDBC 4.0 API是 作为Sun Java SE开发工具包(JDK)6.0和 Java运行时环境(JRE)6.0。 JDBC 4.0是它的超集 JDBC 3.0 API。
    4. 更多信息:System Requirements for the JDBC Driver

      设置CLASSPATH变量

      必须在CLASSPATH变量中列出JDBC .jar文件的Microsoft SQL Server 2000驱动程序。 CLASSPATH变量是Java虚拟机(JVM)用于在计算机上查找JDBC驱动程序的搜索字符串。如果您的CLASSPATH变量中未列出驱动程序,则在尝试加载驱动程序时会收到以下错误消息:

      java.lang.ClassNotFoundException: com/microsoft/jdbc/sqlserver/SQLServerDriver
      

      设置系统CLASSPATH变量以包含以下条目:

        

      \您的安装路径\ Lib \ Msbase.jar

           

      \您的安装路径\ Lib \ Msutil.jar

           

      \您的installationpath \ Lib \ Mssqlserver.jar

      这是已配置的CLASSPATH变量的示例:

        

      CLASSPATH =。; c:\ program files \ Microsoft SQL Server 2000 Driver for   JDBC \ lib \ msbase.jar; c:\ program files \ Microsoft SQL Server 2000 Driver   对于JDBC \ lib \ msutil.jar; c:\ program files \ Microsoft SQL Server 2000   JDBC \ lib \ mssqlserver.jar的驱动程序

      注册驱动程序

      注册驱动程序会指示JDBC Driver Manager加载哪个驱动程序。使用class.forName函数加载驱动程序时,必须指定驱动程序的名称。这是用于JDBC的Microsoft SQL Server 2000驱动程序的驱动程序名称:

      com.microsoft.jdbc.sqlserver.SQLServerDriver
      

      以下示例代码演示了如何注册驱动程序:

      Driver d = (Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
      

      传递连接URL

      您必须以连接URL的形式传递数据库连接信息。这是用于JDBC的Microsoft SQL Server 2000驱动程序的模板URL。替换数据库的值:

      jdbc:microsoft:sqlserver://servername:1433
      

      以下示例代码演示了如何指定连接URL:

      con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433", "userName", "password");
      

      选择正确的JAR文件

      1. 提供 Microsoft JDBC驱动程序6.0 4.2 for SQL Server sqljdbc.jar,sqljdbc4.jar,sqljdbc41和sqljdbc42.jar类 要使用的库文件,具体取决于您首选的Java Runtime 环境(JRE)设置。
      2. Microsoft JDBC驱动程序 4.1 for SQL Server 提供了sqljdbc.jar, sqljdbc4.jar和要使用的sqljdbc41.jar类库文件 取决于您首选的Java运行时环境(JRE)设置。
      3. SQL Server 4.0 的Microsoft JDBC驱动程序提供了sqljdbc.jar 和sqljdbc4.jar类库文件将根据您的使用情况而定 首选的Java运行时环境(JRE)设置。
      4. 与数据库建立简单连接

        使用sqljdbc.jar类库,应用程序必须首先注册驱动程序,如下所示:

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        

        加载驱动程序后,可以使用连接URL和DriverManager类的getConnection方法建立连接:

        String connectionUrl = "jdbc:sqlserver://localhost:1433;" +  
           "databaseName=AdventureWorks;user=MyUserName;password=*****;";  
        Connection con = DriverManager.getConnection(connectionUrl); 
        

        在JDBC API 4.0中,增强了DriverManager.getConnection方法以自动加载JDBC驱动程序。因此,在使用sqljdbc4.jar,sqljdbc41.jar或sqljdbc42.jar类库时,应用程序不需要调用Class.forName方法来注册或加载驱动程序。 调用DriverManager类的getConnection方法时,会从已注册的JDBC驱动程序集中找到相应的驱动程序。 sqljdbc4.jar,sqljdbc41.jar或sqljdbc42.jar文件包含"META-INF/services/java.sql.Driver"文件,其中包含com.microsoft.sqlserver.jdbc.SQLServerDriver作为注册驱动程序。当前使用Class.forName方法加载驱动程序的现有应用程序将继续工作而无需修改。

        资源链接:

        所有数据均来自以下 -

        1. Using the JDBC Driver
        2. HOW TO: Get Started with Microsoft JDBC
        3. ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver

答案 1 :(得分:1)

CLASSPATH变量是Java虚拟机(JVM)用于在计算机上查找JDBC驱动程序的搜索字符串。如果您的CLASSPATH变量中未列出驱动程序,则在尝试加载驱动程序时会收到以下错误消息: java.lang.ClassNotFoundException:com / microsoft / jdbc / sqlserver / SQLServerDriver

检查您的课程路径并告诉我这是否是问题所在。

答案 2 :(得分:1)

您在类路径中不需要jTDS和JDBC。任何一个都是必需的。你最喜欢的只需要sqljdbc.jar。一定要将它放在项目的WEB-INF目录中的lib之类的心理位置,而不是通过IDE将其添加到类路径中。重置您的服务,然后重试。它应该自己解决。

Jar文件可以在这里找到: www.java2s.com/Code/JarDownload/sqlserverjdbc/sqlserverjdbc.jar.zip