- PR -

JDBC-ODBC接続について

1
投稿者投稿内容
TH
会議室デビュー日: 2004/08/19
投稿数: 9
投稿日時: 2004-08-25 07:32
JDBC-ODBCで接続しようとしていますが上手くいきません。
ご教授ください。
1:現象
Db_Connect.java(下記ソース参照のClass.forName(strClassDriver);での
java.lang.ClassNotFoundException:com/microsoft/jdbc/sqlserver/SQLServerDriver
1:ディレクトリ
WEB-INF/classes/dev
この直下にモジュールを格納
2:DBコネクトクラス
--------------- Db_Connect.java ------------------------
package dev;
import javax.sql.*;
import java.sql.*;
import java.util.*;

public class Db_Connect
{

/**
DateBase Connection
*/
private transient Connection conn = null;

/**
Get DB connection
@return DBconnection
*/
public Connection getConnection() throws SQLException
{
String strClassDriver = null; // JDBCDriver
String strUrl = null; // DBURL
String strUser = null; // USER_ID
String strPass = null; // PASSWORD

// Set DateBase Connection
strClassDriver = "com.microsoft.jdbc.sqlserver.SQLServer";
strUrl = "jdbc:microsoft:sqlserver://192.168.100.26:1433";
strUser = "DB_USER_ID";
strPass = "DB_PASSWD";
try
{
Class.forName( strClassDriver );
conn = DriverManager.getConnection(strUrl, strUser, strPass);

if(conn == null)
{
throw new SQLException("getConnection denied");
}
}
catch(SQLException se)
{
throw se;
}
catch(ClassNotFoundException cne)
{
throw new SQLException( cne.toString() );
}
return conn;
}
}
--------------- Db_Connect.java END ------------------------

3 接続をテストするためのサンプルコードで実行した所正常に動作
デプロイ先は同一(WEB-INF/classes/dev)
しかし
A,最初,コマンドラインで実行した所java.lang.ClassNotFoundException:com/microsoft/jdbc/sqlserver/SQLServerDriverが発生したので『環境変数の設定』WEB-INF/classes/devでパスを通した。
B,最初,package dev;を記述していたが(WEB-INF/classes/devにデプロイしたので)Aと同様の現象が起きたため、削除した。

--------------- サンプルコード(Connect.java) ------------------------

import java.*;
public class Connect
{
private java.sql.Connection con = null;
private final String url = "jdbc:microsoft:sqlserver://";
private final String serverName= "192.168.100.26";
private final String portNumber = "1433";
private final String databaseName= "sql_server";
private final String userName = "noho";
private final String password = "capps";
// 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;
}

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

--------------- サンプルコード(Connect.java) END ------------------------

4 http://support.microsoft.com/default.aspx?scid=kb;ja;313100#3で指定されている
パスは全て設定済み。
●\インストール パス \Lib\Msbase.jar
●\インストール パス \Lib\Msutil.jar
●\インストール パス \Lib\Mssqlserver.jar

よろしくお願いします。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-25 09:17
まず、そのドライバは Type4(PureJavaドライバ)で、JDBC-ODBC(Type1)ではないと思います。
http://java.sun.com/products/jdbc/driverdesc.html

マイクロソフトのドキュメントにもありますが、一般的な ClassNotFoundException と同じくクラスパスが通っていないのが原因です。

>B,最初,package dev;を記述していたが(WEB-INF/classes/devにデプロイしたので)Aと同様の現象が起き
>たため、削除した。
"WEB-INF/classes/dev にデプロイした"とはどういう意味でしょうか?これはサーブレットではないようです。main メソッドもありませんがどのように実行していますか?

サーブレット内から呼びだしているのであればアプリケーションサーバのクラスパスに jar を通すか、WEB-INF/lib ディレクトリにライブラリを配置しましょう。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-08-25 09:24
引用:

THさんの書き込み (2004-08-25 07:32) より:
JDBC-ODBCで接続しようとしていますが上手くいきません。
ご教授ください。
1:現象
Db_Connect.java(下記ソース参照のClass.forName(strClassDriver);での
java.lang.ClassNotFoundException:com/microsoft/jdbc/sqlserver/SQLServerDriver
1:ディレクトリ
WEB-INF/classes/dev
この直下にモジュールを格納


 うーん、この手のって過去ログにゴロゴロ転がっているはず・・・。

 Tomcat等のAPサーバーは、環境変数のクラスパスを無視します。
ですから、JDBCドライバーのjarファイルを、
クラスパスが通る場所に配置する必要があります。
例えば、下記などはファイルを置くだけでクラスパスが通っているとみなされます。
%CATALINA_HOME%/common/lib
%JAVA_HOME%/jre/lib/ext
朝倉義弘
常連さん
会議室デビュー日: 2004/09/07
投稿数: 23
お住まい・勤務地: 東京
投稿日時: 2004-09-07 17:35
初めて投稿します。
スレッド立てた方と同じ現象が起きます。JSP内(AP鯖はTomcat4)からMySQL(ver.4)に接続しようとすると以下のエラー。コネクターはmysql-connector-java-3.0.15です。
エラー内容(Eclipse3から取ってきました。普通にTomcatを動かしても同様の症状が出ますのでEclipseのエラーではなさそうですが…)
------------------------------------------------------------------------------
情報: Jk running ID=0 time=10/341 config=C:\Program Files\Apache Group\Tomcat 4.1\conf\jk2.properties
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver.class
------------------------------------------------------------------------------
試したこと。
1.環境変数についてはTomcatは上書きするとのことなので、webアプリの/libの中においてみましたが、アウト。
2.それならばということで、TomcatのHOME下の/libに投入。しかし、だめ。
3.最後にJDKの/jre/lib/extに起きましたが、やっぱりエラー(汗)
#Class.forName("com.mysql.jdbc.Driver.class"); で呼んでいます
ひょっとして、読み込まれてないのかな?と思ってファイルを動かそうとするとTomcatが稼働している間はファイルがロックされている旨の警告がでます。
なにか他に考えられる原因はありませんでしょうか…?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-07 17:39
引用:

砂倉義弘さんの書き込み (2004-09-07 17:35) より:
#Class.forName("com.mysql.jdbc.Driver.class"); で呼んでいます


.classは不要です。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-09-07 17:46
引用:

砂倉義弘さんの書き込み (2004-09-07 17:35) より:
#Class.forName("com.mysql.jdbc.Driver.class"); で呼んでいます


 これだと、「com.mysql.jdbc.Driver.class」という名前のクラスを探しにいくので、
「com.mysql.jdbc.Driver.class.class」というクラスファイルを、
見つけることが出来ないために、
ClassNotFoundExceptionが発生しているはずです。

 ですから、正しくは、

Class.forName("com.mysql.jdbc.Driver");

となるかと思います。
※MySQLのJDBCドライバーのクラス名が、
 正しいかどうかはご自分で確認をして下さい。
朝倉義弘
常連さん
会議室デビュー日: 2004/09/07
投稿数: 23
お住まい・勤務地: 東京
投稿日時: 2004-09-08 10:35
ukさん、takuさん回答ありがとうございます。
ご指摘の通り、.classまで指定してたのが不具合の原因でした(汗)
#jarの中に入っているのですから当然ですね...

個別のアプリのWeb-inf/lib以下において動作できました。
ありがとうございましたm(._.)m
教訓:設定疑う前に自分のコードを疑おう
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-08 10:52
> #jarの中に入っているのですから当然ですね...
ん? jar に入っているのは関係ありませんよ?
WEB-INF/classes 以下に展開して配置したとしても同じです。
1

スキルアップ/キャリアアップ(JOB@IT)