- PR -

お願いします。

1
投稿者投稿内容
Tomato
会議室デビュー日: 2007/06/22
投稿数: 5
投稿日時: 2007-06-22 19:36
MySqlで問題なかったプログラムをOracleに変えると問題になりました。
エラーメッセージは「列名が無効」です。
Jdbcは既にMySqlからOracleにかえりました。(ここは問題ないと思います。)
プログラムは以下です。長いです〜

public ArrayList findJobList(String id ,String name ,Date start_date ,Date end_date, String company ,String tanto)
throws SQLException{
ArrayList list = new ArrayList();
Connection con = null;
try{
//DB接続
con = createConnection();
//SQL文編集
String sql ="select A.staff_id,B.name,A.start_date,A.end_date,A.company,A.tanto " +
"from t_job_list A INNER JOIN t_staff B on A.staff_id = B.staff_id ";
boolean whereFlg = false;
if ( !id.equals("") ){
sql = sql + " where A.staff_id = ?";
whereFlg = true;
}
if( !name.equals("") ){
if(whereFlg) {
sql = sql + " and name = ?";
}else{
sql = sql + " where name = ?";
}
whereFlg = true;
}
if( start_date != null ){
if(whereFlg) {
sql = sql + " and start_date = ?";
}else{
sql = sql + " where start_date = ?";
}
whereFlg = true;
}
if( end_date != null){
if(whereFlg) {
sql = sql + " and end_date = ?";
}else{
sql = sql + " where end_date = ?";
}
whereFlg = true;
}
if( !company.equals("") ){
if(whereFlg) {
sql = sql + " and company = ?";
}else{
sql = sql + " where company = ?";
}
whereFlg = true;
}
if( !tanto.equals("") ){
if(whereFlg) {
sql = sql + " and tanto = ?";
}else{
sql = sql + " where tanto = ?";
}
whereFlg = true;
}
sql = sql + " order by A.staff_id";

PreparedStatement pstmt = con.prepareStatement(sql);
int count = 0;
if ( !id.equals("") ){
count++;
pstmt.setString(count,id);
}
if( !name.equals("") ){
count++;
pstmt.setString(count,name);
}
if( start_date != null ){
count++;
//java.sql.Dateからjava.sql.Dateに変更してからセット
pstmt.setDate(count,new java.sql.Date(start_date.getTime() ));
}
if( end_date != null ){
count++;
pstmt.setDate(count,new java.sql.Date(end_date.getTime()));
}
if( !company.equals("") ){
count++;
pstmt.setString(count,company);
}
if( !tanto.equals("") ){
count++;
pstmt.setString(count,tanto);
}
ResultSet rs = pstmt.executeQuery();

while(rs.next()) {
String staff_id = rs.getString("staff_id");
String staff_name = rs.getString("B.name");
Date startDate = rs.getDate("start_date");
Date endDate = rs.getDate("end_date");
String staff_company = rs.getString("company");
String staff_tanto = rs.getString("tanto");

JobList job = new JobList();
job.setStaffID(staff_id);
job.setStaff_name(staff_name);
job.setStart_date(startDate);
job.setEnd_date(endDate);
job.setCompany(staff_company);
job.setTanto(staff_tanto);
//リストに追加
list.add(job);
}
return list;
}catch( SQLException e ){
e.printStackTrace();
throw e;
}finally{
closeConnection(con);
}
}

エラーの所は「String staff_name = rs.getString("B.name");」ですが
「String staff_name = rs.getString("name");」と
「String staff_name = rs.getString(2);」に変更してもエラーでした。

本当に宜しくお願いします。

_________________
よっしー
会議室デビュー日: 2007/05/30
投稿数: 10
投稿日時: 2007-06-22 22:25
単純にOracleとMySqlでテーブル構造が違ってたり、とかないですか?
列名が無効というからにはSQL投げるとこで失敗しているのは確実だと思います。
ですので、実際に投げてるSQLを(ログではくなどして)取得して、SQLPLUSなどで実行してみるのが、一番の早道かと思います。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2007-06-24 04:26
引用:

Tomatoさんの書き込み (2007-06-22 19:36) より:

エラーの所は「String staff_name = rs.getString("B.name");」ですが
「String staff_name = rs.getString("name");」と
「String staff_name = rs.getString(2);」に変更してもエラーでした。



どのようなエラーなのかがわかりません。
列番号を指定する方法だとエラーが発生したとしても ORA-00904 にはならないと思いますがいかがでしょうか。

あと、MySQL と Oracle では、私が知っている範囲だけでも以下の違いがあります。
このあたりに注意して調べてみてください。

(1) DBMS そのものの違い
テーブル名や列名に大文字小文字を混在させた場合、MySQL では混在可だったと思いますが、Oracle では原則区別せず内部ではすべて大文字になります。
create table test1 (a number(10)) と定義しても、テーブル名は TEST1、列名は A です。
create table "Test1" とクォートすれば混在した名前にすることもできますが、JDBC からアクセスする場合は余計なトラブルの原因になることがあります。

(2) JDBC ドライバの違い
こちらは突っ込んで調べておらず憶測ですが、ResultSet#getString(String) メソッドの引数として、テーブル名で修飾された列名(B.NAME 等)を認めるか否かの違いがあるかもしれません。

まず、sqlplus 等で Oracle が管理しているテーブル名と列名を調べてみてください。
よっしー
会議室デビュー日: 2007/05/30
投稿数: 10
投稿日時: 2007-06-24 19:11
ずっと返答がないようですが、試してるんですかね?

ちょっと気になったので環境作って試してみました。
確かに、「列名が無効です」のエラーがでます。気になってる人のために書くと、

java.sql.SQLException: 列名が無効です。

ですね。

>エラーの所は「String staff_name = rs.getString("B.name");」ですが
>「String staff_name = rs.getString("name");」と
>「String staff_name = rs.getString(2);」に変更してもエラーでした。
という事でしたが、こちらの環境ではrs.getString("name")に変更したら正常に動きましたよ。B.nameはだめみたいですね。
本人は試したつもりで実は試せてないってことも結構あるので、また試して見てください。
Tomato
会議室デビュー日: 2007/06/22
投稿数: 5
投稿日時: 2007-06-25 15:33
よっしーさん、Gioさん どうもありがどうございました。

今日でやっと解決しました。

問題があったポイントはプログラムじゃなくて開発の環境にありました。
今回、私が作ったプロジェクトはEclipse + Tomcat + Oracle でしたが、
同じワークスペースに 一番最初に作ったEclipse + Tomcat + MySql のプロジェクトもあったのです。で、今日、Eclipse + Tomcat + MySql で作ったプロジェクトを削除してから「 String staff_name = rs.getString(2); 」したら問題は解決しました。

皆さん、又宜しくお願いします。
1

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