質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
SQL Anywhere

SQL Anywhereは、パッケージソフト組込みやハードウェア組込みなどのパッケージの名称。RDBMSやデータベースの同期ミドルウェアもパッケージになっています。また、メインのRDBMSサーバーを指すこともあります。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

1696閲覧

Linuxでsajdbc4を使用したSQL Anywhere接続時のエラー:無効な ODBC ハンドルです。

Hogeike

総合スコア293

SQL Anywhere

SQL Anywhereは、パッケージソフト組込みやハードウェア組込みなどのパッケージの名称。RDBMSやデータベースの同期ミドルウェアもパッケージになっています。また、メインのRDBMSサーバーを指すこともあります。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/10/30 04:49

編集2020/11/02 04:19

前提・実現したいこと

JavaからJDBCでSQL AnywhereのDBにクエリを投げるプログラムを作成しました。
Windowsで開発し、JarにエクスポートしたものLinuxサーバで稼働させようとしています。
Windowsでは問題なく接続できましたが、Linuxでjarを実行したところ、エラーが出てしまいました。
エラーの解消方法を教えてください。

発生している問題・エラーメッセージ

java.sql.SQLException: 無効な ODBC ハンドルです。 at sap.jdbc4.sqlanywhere.IDriver.makeODBCConnection(Native Method) at sap.jdbc4.sqlanywhere.IDriver.connect(IDriver.java:775) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228) at database.DatabaseAccess.main(DatabaseAccess.java:24)

該当のソースコード

java

1public class DatabaseAccess { 2 public static void main(String[] args) { 3 String url = "jdbc:sqlanywhere:Server=*********;DBN=*********;host=**.**.**.**:****;"; 4 String uid = "****"; 5 String pwd = "****"; 6 Connection connection = null; 7 PreparedStatement ps = null; 8 ResultSet rs = null; 9 String sql = "SELECT * FROM table_name"; 10 try { 11 connection = DriverManager.getConnection(url,uid,pwd); 12 ps = connection.prepareStatement(sql); 13 rs = ps.executeQuery(); 14 while(rs.next()) { 15 System.out.println(rs.getString("column_name")); 16 } 17 }catch(SQLException e) { 18 e.printStackTrace(); 19 } 20 } 21}

試したこと

Windows側のsajdbc4.jarを使用したら別のエラーが出てしまっていたので、
LinuxのSQL Anywhereインストールファイルにあるsajdbc4.jarを使用したらこのエラーが出ました。
このエラーについては探してもなかなか出てこないので困っています。

PATHとLD_LIBRARY_PATHに、bin64とlib64を通してあります。

補足情報(FW/ツールのバージョンなど)

JRE: 11.0.8
SQL Anywhere: 17


追記1

こちらの記事を参考に

sajdbc4.jarにパスが通っていないのではと推測
Linuxにインストールされたsajdbcにはパスが通っているはずなので、本来であればそこを直接参照したいが、今回はWindowsで開発したものをLinuxに持ってきているので、classpathで直接指定するのが難しい。
そこで、外部jarを外出ししてjarエクスポートして、作成されたライブラリディレクトリにPATHとLD_LIBRARY_PATHを通してみたが、エラーは変わらなかった。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

.bashrcsa_config.shのパス(Bin64)を通すのではなく、sa_config.shの内容を直接書き込んだら動作しました。ありがとうございました。

投稿2020/11/12 03:21

Hogeike

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

重要な部分はマスクしてもらって構いませんが、接続時のURL※を教えて頂けないでしょうか。
(※「jdbc:xxxx」のような値のもの)
気になったことは、スタックトレース内にmakeODBCConnectionという表記があることです。
ODBC経由でつなごうとしているのではないかと思いますが、いかがでしょうか。

投稿2020/10/30 06:20

plasticgrammer

総合スコア629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hogeike

2020/10/30 06:26

回答ありがとうございます。 接続文字列を一部表示するように修正しました。 私もそこは不思議に思いました。JDBCを指定しているのになぜODBCが出るのか不明です。
plasticgrammer

2020/10/30 06:46

可能なら試してみていただきたいのは、URLにユーザーとパスワードを含める方法です。 urlに"UID=***;PWD=***;"を追加するとどうなるでしょうか。 (getConnectionの引数はurlのみに変更)
Hogeike

2020/11/02 02:21

試してみましたが、結果は変わりませんでした。 クラスパスに余計なものが入っていたので削除しましたが、それでも変化ありませんでした。
plasticgrammer

2020/11/02 03:26 編集

追加で確認させてください。 追記1にあるリンク先の記事側には、LD_LIBRARY_PATHの設定について記載がありましたが、こちらも対応済みなのでしょうか。 (libdbjdbc16.soがある場所を設定するものと思っています)
Hogeike

2020/11/02 04:19 編集

はい。PATHとLD_LIBRARY_PATHの両方にパスを通しました。 SQL Anywhere 17なので、libdbjdbc17.soですね。 もともとこれを通していなくてno dbjdbcエラーになっていましたが、解消し、 その後sajdbc4のビルドが違うエラーが出て、それはWindowsのsajdbcを使用していたからだと気づきそれも解消し、 その後、この問題にあたりました。 PATHとLD_LIBRARY_PATHを通している旨について追記します。
plasticgrammer

2020/11/03 06:28

回答ありがとうございました。 接続の前に、下記のように明示的なドライバクラスの読み込みを行うとどうなりますでしょうか。 Class.forName("sap.jdbc4.sqlanywhere.IDriver");
Hogeike

2020/11/11 04:19

返答遅くなり申し訳ございません。 コネクション確立前にドライバクラスの読み込みをしてみましたがエラーに変化はありませんでした。 WindowsとLinuxで異なる必要ファイルがlibdbjdbc以外にあるか、自動的にWindows用の設定になっている何かがあるせいでうまくいかないのではないかと思いました。
Hogeike

2020/11/12 03:22

解決しました。インストール後の環境設定の問題でした。 回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問