ママのスキンケアのお悩みにおすすめアイテム

WebSphereとDB2を使用してDB2へアクセスしてテーブルからデータの取得をしたいと思っています。
このとき、DB2のJDBCを使用しますが、getConnectionでコネクションを取得するときに指定するDBのURLに、複数の指定方法があるようです。

その1: jdbc:db2:データベース名
その2: jdbc:db2://ホストIP:ポート番号/データベース名

その1の方法ではコネクションを取得できたのですが、その2の方法では失敗しました。

ホストIPには自分のマシンのIPを、ポート番号にはDB2をインストールしたときに設定した番号を指定しました。

この両者の違いをご存知の方は教えてください。
また、その2の方法でなぜ失敗したのか、見当がつく方がいたらこちらも教えていただきたいと思います。

なお、実行環境は以下の通りです。

CPU ペンティアム3 800Mhz
メモリ 512MByte
OS Windows2000 SP2
ブラウザ IE5.5 SP2
AS Websphere 4.0
DB DB2 7.2

※WebshpereとDB2は同一マシンにインストールされています。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず、


その1: jdbc:db2:データベース名
その2: jdbc:db2://ホストIP:ポート番号/データベース名
の違いですが、
「その1」の方はJava実行マシンとDB2サーバが同じホスト上にある場合(Type2のJDBCドライバ用?)に使うようです。
それに対して、「その2」は、ホスト名とポート番号を指定していることからわかるように、Java実行マシンとDB2サーバが別々のホスト上にある場合(Type4のJDBCドライバ用?)に使うようです。

で、なんで「その2」で接続ができないのかという原因ですが、
(1)サーバー側の設定が足りない
(2)ドライバ名が違う
の2つが考えられます。

(1)の方は、サーバー側で「このポート番号でJDBC接続を待ち受けます」という設定を行う必要があります。これは、"db2jstrt <ポート番号>"というコマンドをサーバー上で実行することで、設定できます。
(2)の方は、"COM.ibm.db2.jdbc.net.DB2Driver"というJDBCドライバを使っているか確認してください。"COM.ibm.db2.jdbc.app.DB2Driver"ではありません。こっちだと、「その1」の方の接続方法しかサポートしていないような気がします。(よく調べていないのでわかりませんが)

以上2点を確認してみては?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

私が使用していたJDBCドライバーは、"COM.ibm.db2.jdbc.app.DB2Driver"でした。
ドライバーを"COM.ibm.db2.jdbc.net.DB2Driver"に変更したところ、"jdbc:db2://ホストIP:ポート番号/データベース名"という指定でDB2に接続できました。

ただ、"jdbc:db2:データベース名"で指定したら接続が出来なくなっていたので、それぞれのJDBCドライバーによってサポートされている接続方法が違うみたいですね。

どうもありがとうございました。

お礼日時:2002/08/21 10:18

全然違ってたらすみません。



私も最初は、jdbc:db2://ホストIP:ポート番号/データベース名
に教えてもらったんですが、ホストIP:ポート番号は省略できますよ。

jdbc:db2:///データベース名 でOKです。

なお、難しいことは分かりませんが、データベース名はlocalhostで良いんではないでしょうか?
    • good
    • 0
この回答へのお礼

ご回答をありがとうございます。

今の環境は、DB2とWebSphereは同一マシン上にあるので、ホストIPとポート番号の指定がなくてもDB2にアクセスできます。

しかし、DB2とWebSphereが別のマシン上にあるときは、このままだとアクセスできないと思うので、今回質問させていただきました。

最初の質問でも書いたように、「jdbc:db2:データベース名」で指定したときは、アクセスできました。
ちなみに、「jdbc:db2:///データベース名」で指定したときはアクセスできませんでした。

kamkamkam3さんは、「jdbc:db2://ホストIP:ポート番号/データベース名」で指定したときも、DB2にアクセスできたのでしょうか?

もし、アクセスできているとすると、私の環境のどこかがおかしいということですね。
(インストール時に何かの設定を忘れているとか・・・)

あと、localhostは自分のマシンのIPアドレスを指定する代わりに良く使われているみたいなので、データベース名ではないと思います。
データベース名はDB2で、"db2 create db XXXX"というコマンドでDBを作成するときに作る「XXXX」の部分になるようです。

お礼日時:2002/08/20 11:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDB2でのシステム日付のinsert、updateについて。

質問です。
DB2で、システム日付のinsert、updateを行うSQLを作成したいのですが、どのようにしたら良いでしょうか?

また、参考になるようなサイトなどありましたら教えてください。

どなたか宜しくお願いします。

Aベストアンサー

そうですか・・・。
DB2V8 FP2 on WinXPProのCLPではうまくいっていますが・・・。

(成功例)

db2 connect to sample
db2 create table hoge(no integer,date date)
db2 insert into hoge values (1,current date)
db2 update hoge set date=current date where no=1

ちなみに

db2 update hoge set date=current date where no='1'

⇒SQL0401N(SQLSTATE=42818)エラー

db2 update hoge set date=integer(current date) where no=1

⇒SQL0408N(SQLSTATE=42821)エラー

でした。
no列はINTEGER型で間違いないんですよね?
以下はどういうエラーになりますか?

db2 update hoge set date=current date

そうですか・・・。
DB2V8 FP2 on WinXPProのCLPではうまくいっていますが・・・。

(成功例)

db2 connect to sample
db2 create table hoge(no integer,date date)
db2 insert into hoge values (1,current date)
db2 update hoge set date=current date where no=1

ちなみに

db2 update hoge set date=current date where no='1'

⇒SQL0401N(SQLSTATE=42818)エラー

db2 update hoge set date=integer(current date) where no=1

⇒SQL0408N(SQLSTATE=42821)エラー

でした。
no列はINTE...続きを読む

QDB2のTimestamp型

DB2のTimestamp型のカラムに
'Current-Timestamp'以外で
設定可能なデフォルト値というのは
あるのでしょうか?

Aベストアンサー

以下のURLが参考になると思います。

参考URL:http://www-06.ibm.com/jp/software/data/developer/library/techdoc/daytime.html

QDB2のSQL(日付)について

文字列で8桁の日付(例:20041208)を持っている項目の条件に本日日付以上という条件をつけたいのですが、
(例:where NEN >= 本日日付の文字列8桁 )
※NEN:20041208
SQLでシステム日付を文字列8桁にする方法はありますか?
ご教授お願いしますm(_ _)m

Aベストアンサー

(前にも回答したと思うのですが、入っていないようなので再度入力します)

大小の比較をしたいのでしたら、DATE型を文字列にしても駄目で、文字列をDATE型に変換する必要があります。
8文字で表された日付をDATE型に変換する関数はDB2には用意されていないので、自分で用意する必要があります。

CREATE FUNCTION STR2DATE (dateString VARCHAR(8))

RETURNS DATE

SPECIFIC STR2DATE

LANGUAGE SQL

DETERMINISTIC

CONTAINS SQL

BEGIN ATOMIC

DECLARE ret VARCHAR(10);



IF (LENGTH(dateString) != 8) THEN

RETURN DATE('1970-01-01');

END IF;



set ret = LEFT(dateString,4) || '-' || SUBSTR(dateString,5,2) || '-' || RIGHT(dateString,2);



RETURN ret;

END@

という感じでSTR2DATE関数を用意しておいて、
SELECT ... WHERE STR2DATE(NEN) >= CURRENT DATE
とやればうまくいくのではないでしょうか。

(前にも回答したと思うのですが、入っていないようなので再度入力します)

大小の比較をしたいのでしたら、DATE型を文字列にしても駄目で、文字列をDATE型に変換する必要があります。
8文字で表された日付をDATE型に変換する関数はDB2には用意されていないので、自分で用意する必要があります。

CREATE FUNCTION STR2DATE (dateString VARCHAR(8))

RETURNS DATE

SPECIFIC STR2DATE

LANGUAGE SQL

DETERMINISTIC

CONTAINS SQL

BEGIN ATOMIC

DECLARE ret VARCHAR(10);



IF (LENGTH(...続きを読む

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

Qコマンドプロンプトを使ってipアドレスからコンピュータ名を知る方法

ipアドレスは分かっていますがコンピュータ名が分かりません。リモート接続ソフトなどは使えないので、それでコンピュータ名を調べることはできません。
コマンドプロンプトを使ってipアドレスからコンピュータ名を知る方法を教えてください!

Aベストアンサー

なんか回答がバラバラなので整理しましょう。
調査している自分自身が使用している端末は、Windows XPのPCであると仮定します。
また、調べるのは基本的に外部から名前解決可能な名前(No.2さんの言う"2"に相当する名前)とします。

パターン1:
対象のIPアドレスがWindows端末機で、自分が使用している端末と同じネットワークに属しているか同一のWINSサーバを参照しているとき……No.4さんの答えで検索できます。

nbtstat -A <IP Address>

パターン2:
ネットワーク管理者がDNSをきちんと管理しており、対象IPについても管理者の管理下にある場合……以下2つのいずれかの方法で検索できます。

  nslookup <IP address>

または

  nslookup -q=ptr <reverse ip>.in-addr.arpa.
  ex) 192.168.12.1 のIPを調べたい場合、以下のように入力する
  nslookup -q=ptr 1.12.168.192.in-addr.arpa.

  (DNSサーバで逆引きが設定されていないと、正しく検索できない場合があります)

パターン3:
上記以外の場合

外部から名前解決できないので、調べようがありません。または、調べてもそれが正しいホスト名である保証がありません。
そのIPの端末自体に設定されているホスト名を直接調べるしかありませんが、それには実際にそのIPの端末を操作して調べるしかありません。
つまり、No.2さんの回答となるのですが、
IPを使用しているのがWindows PCやUnixサーバなどである保証はないので、確認するコマンドはその端末の種類(OS)によって異なります。

なお、tracert (traceroute)を使用する、という回答がありますが、これはパターン1またはパターン2のいずれかまたは両方を満たしていないと表示されませんので、厳密には正しい答えとはいえません。
(たいていの場合、"tracert <IP address>" や "ping <IP address>"で用が足りてしまうことも多いので、必ずしも間違いではないのですが)

なんか回答がバラバラなので整理しましょう。
調査している自分自身が使用している端末は、Windows XPのPCであると仮定します。
また、調べるのは基本的に外部から名前解決可能な名前(No.2さんの言う"2"に相当する名前)とします。

パターン1:
対象のIPアドレスがWindows端末機で、自分が使用している端末と同じネットワークに属しているか同一のWINSサーバを参照しているとき……No.4さんの答えで検索できます。

nbtstat -A <IP Address>

パターン2:
ネットワーク管理者がDNSをきちんと管理して...続きを読む

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QDB2のコマンドラインexportで複雑なselectの指定は可能?

オラクルだとspoolでselect文の出力結果をCSV形式等にして取得できるのですが、DB2で同じ事が可能かと調べてます。db2コマンドのexportを使えばできそうかと思うのですが、複雑なselect文の時にコマンドラインに全部書かなければならないのか、他に手段があるのか、悩んでいます。

Aベストアンサー

export コマンドを使ったCVS形式でのファイル出力    →できます
コマンドラインではなく外部ファイルを使用したSQLの実行 →できます

具体的なやり方
以下のファイル(hoge.txt)を作成する。
----------------------------------------------------------
connect to DB名 user DBユーザー名 using パスワード;
export to ファイル名 of del SQL文(ex select * from hoge) ;
connect reset;
----------------------------------------------------------
db2 -tvf hoge.txt

でできます。
windowsだと、db2コマンドウィンドウで、
UNIX、Linuxなら、db2インスタンスユーザー等、
db2コマンドが使える状態になっていないとできません。

参考URL:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/core/r0008303.htm

export コマンドを使ったCVS形式でのファイル出力    →できます
コマンドラインではなく外部ファイルを使用したSQLの実行 →できます

具体的なやり方
以下のファイル(hoge.txt)を作成する。
----------------------------------------------------------
connect to DB名 user DBユーザー名 using パスワード;
export to ファイル名 of del SQL文(ex select * from hoge) ;
connect reset;
----------------------------------------------------------
db2 -tvf hoge.txt

でできます。
window...続きを読む

Qcsv出力について

JDBCでDBからデータを取得して、そのデータをCSV形式でEXCELに出力したい
のですが、どのようにすればいいか教えてください。
よろしくお願いします。

Aベストアンサー

どのように・・・と言いますと? どこから説明すればいいのでしょうか?(^_^;
「Excelに出力」というニュアンスから、やりたいことを100%実現するのは多分無理かな・・・と思うのですが。

とりあえず、ちょっと長いですが、簡単なサンプルを付けておきますね。
このサンプルは、

>java DBWriter ファイル名 "SQL文"

とすると動くもので、指定したファイル名にSQLの結果をCSV形式で吐き出します。

実行例)
>java DBWriter C:\tmp\TEST.csv "SELECT * FROM EMP"

ちょっとインデントがなくて見にくいですが、テキストエディタ等に貼り付けて見やすくしてください。
バグ取りはしてませんので、悪しからず。
-------------------------------------------------------------
import java.io.*;
import java.util.*;
import java.sql.*;

public class DBWriter {

public DBWriter() {
super();
}

public static void main(java.lang.String[] args) {

if (args.length != 2) {
System.out.println("起動方法が違います");
System.exit(1);
}
else {
try {
DBWriter dbWriter = new DBWriter();
// 引数1をファイル名、引数2をSQL文として扱う
dbWriter.createCSV(args[0], args[1]);
}
catch (Exception e) {
// 何らかのエラーがあっても、表示するのみ
System.out.println("エラーです");
e.printStackTrace();
}
}
}

protected void createCSV(String fileName, String sql) throws Exception {

// ドライバクラス名。これはOracleの場合の例。
String driverName = "oracle.jdbc.driver.OracleDriver";
// JDBCドライバURL。これはOracleの場合。
String connURL = "jdbc:oracle:thin:@172.20.108.51:1521:NDCORE2";
String connUID = "ibm07s"; // DBの接続ユーザ名
String connPWD = "ibm07s"; // DBの接続パスワード

Vector datas = new Vector(); // データ格納用の可変長配列

// データベースに接続する
Class.forName(driverName);
Connection conn = DriverManager.getConnection(connURL, connUID, connPWD);

// SQLを発行する
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);

// ファイルをオープンする(ようなもの)
File file = new File(fileName);
FileWriter fw = new FileWriter(file);

// データベースの列名定義を取得する
ResultSetMetaData rsmd = rs.getMetaData();
int cnt = rsmd.getColumnCount();
for (int idx = 1; idx <= cnt; idx++) {
String colName = rsmd.getColumnName(idx);
datas.add(colName);
}
// 列名をファイルに書き出す
writeData(fw, datas);

// データベースの各列のデータを取得する
while (rs.next()) {
for (int idx = 1; idx <= cnt; idx++) {
String data = rs.getString(idx);
datas.add(data);
}
// 各列のデータをファイルに書き出す
writeData(fw, datas);
}
// ファイルを閉じる
fw.close();
}
protected void writeData(FileWriter fw, Vector datas) throws IOException {

String buf = ""; // ファイルに書き出す文字列を入れるところ

// データが空でなかった場合のみ実行
if (datas != null && !datas.isEmpty()) {
for (int idx = 0; idx < datas.size(); idx++) {
// 先頭以外で、カンマをつける
if (idx > 0) {
buf += ",";
}
// 取り出したデータを文字列にくっつける
buf += (String)datas.get(idx);
}
// 行末に改行を入れる
buf += "\n";
// できた文字列をファイルに書き出す
fw.write(buf);
// もらったデータを空にする
datas.clear();
}
}
}

どのように・・・と言いますと? どこから説明すればいいのでしょうか?(^_^;
「Excelに出力」というニュアンスから、やりたいことを100%実現するのは多分無理かな・・・と思うのですが。

とりあえず、ちょっと長いですが、簡単なサンプルを付けておきますね。
このサンプルは、

>java DBWriter ファイル名 "SQL文"

とすると動くもので、指定したファイル名にSQLの結果をCSV形式で吐き出します。

実行例)
>java DBWriter C:\tmp\TEST.csv "SELECT * FROM EMP"

ちょっとインデントがなくて見に...続きを読む

QEXCELの文字列操作で文字数不足の分をスペースで補う方法

EXCELの文字データを取り出す際に以下のような操作を行いたいんですが、方法をご存知の方がいらっしゃいましたら教えていただけませんでしょうか。

既にデータの入力されているセルの文字数が、ある一定数に満たない場合は不足分を半角スペースで補う

【例】文字数を15と指定したとします
セルに入力されたデータ:山田_ 太郎
   ↓
求めたいデータ:山田_ 太郎_ _ _ _ _ _
(山田の後に半角スペースが1、太郎の後に半角スペースが6つ入っていると仮定してください)

※TEXT関数で数値の文字数不足分を0で埋めるということはできたのですが、TEXT関数は数値のみを対象としているようで・・・。
【例】12345 → 000000000012345

よろしくお願いいたします。

Aベストアンサー

A1に「山田 太郎」が入っている場合、
 =LEFTB(A1&REPT(" ",15),15)
と式を立てればOKです。

LEFBは、左側から指定バイト分(半角1バイト・全角2バイト)を抜き出す関数。
REPTは、所定の文字をくり返す関数です。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む


人気Q&Aランキング