Symfoware

Symfowareについての考察blog

ScalaからJDBC接続でSymfowareに接続する

ScalaはJavaで動いていますので、Javaのオブジェクトを触ることが出来ます。

サンプルとして、ScalaからJDBC経由でSymfowareに接続し、データを取り出してみました。

■sym.scala


import java.sql.{DriverManager, Connection, Statement, ResultSet}

object Sym {
    def main(arg:Array[String]) = {
        //コメントの書き方は、javaと同じ
        /* Symfowareドライバをロードする */
        Class.forName("com.fujitsu.symfoware.jdbc.RDADriver")
        
        var con:Connection = DriverManager.getConnection("jdbc:symforda://[IPアドレス]:[ポート]/[データベース]","[ユーザーID]", "[パスワード]");
        var stmt:Statement = con.createStatement()
        
        var rs:ResultSet = stmt.executeQuery("SELECT * FROM SC_SAMPLE.TA_SAMPLE");
        
        while (rs.next()){
            println(rs.getString("氏名"))
        }
        
        stmt.close()
        con.close()
        
        println("sucsess!")
    }
}




RDA接続は、こちらを参考にしました。

SymfowareにJava(JDBC)で接続する



コンパイルと実行はこんな感じ


scalac sym.scala
scala -classpath .;C:\SFWCLNT\JDBC\fjjdbc\lib\fjsymjdbc2.jar Sym



実行時、jdbcドライバをクラスパスで指定してやる必要があります。
その前の「.」については以前の記事を参照。

ScalaでHelloWorld




Javaでは、import文を

import java.sql.*

と記述することが出来ますが、Scalaでは

import java.sql._

と書くようです。


上記の
import java.sql.{DriverManager, Connection, Statement, ResultSet}
の部分を
import java.sql._
に変更してみると、コンパイルは通るのですが、実行時


java.lang.NoSuchMethodException: Sym.main([Ljava.lang.String;)



というエラーが発生します。


取っ掛かりがないので、
import java.sql.{DriverManager, Connection, Statement, ResultSet}
と宣言した場合と
import java.sql._
で宣言した場合に生成されるclassファイルをjadで逆コンパイルし、内容を比較してみました。


import java.sql.{DriverManager, Connection, Statement, ResultSet}



■Sym.class

import java.rmi.RemoteException;

public final class Sym
{

    public static final void main(String args[])
    {
        Sym$.MODULE$.main(args);
    }

    public static final int $tag()
        throws RemoteException
    {
        return Sym$.MODULE$.$tag();
    }
}




■Sym$.class

import java.rmi.RemoteException;
import java.sql.*;
import scala.Predef$;
import scala.ScalaObject;

public final class Sym$
    implements ScalaObject
{

    public Sym$()
    {
    }

    public void main(String arg[])
    {
        Class.forName("com.fujitsu.symfoware.jdbc.RDADriver");
        Connection con = DriverManager.getConnection("jdbc:symforda://[IPアドレス]:[ポート]/[データベース]","[ユーザーID]", "[パスワード]");
        Statement stmt = con.createStatement();
        for(ResultSet rs = stmt.executeQuery("SELECT * FROM SC_SAMPLE.TA_SAMPLE "); rs.next(); Predef$.MODULE$.println(rs.getString("氏名")));
        stmt.close();
        con.close();
        Predef$.MODULE$.println("sucsess!");
    }

    public int $tag()
        throws RemoteException
    {
        return scala.ScalaObject.class.$tag(this);
    }

    public static final Sym$ MODULE$ = this;

    static
    {
        new Sym$();
    }
}





import java.sql._



■Sym.class

import java.rmi.RemoteException;
import java.sql.Array;

public final class Sym
{

    public static final void main(Array array)
    {
        Sym$.MODULE$.main(array);
    }

    public static final int $tag()
        throws RemoteException
    {
        return Sym$.MODULE$.$tag();
    }
}




■Sym$.class

import java.rmi.RemoteException;
import java.sql.*;
import scala.Predef$;
import scala.ScalaObject;

public final class Sym$
    implements ScalaObject
{

    public Sym$()
    {
    }

    public void main(Array arg)
    {
        Class.forName("com.fujitsu.symfoware.jdbc.RDADriver");
        Connection con = DriverManager.getConnection("jdbc:symforda://[IPアドレス]:[ポート]/[データベース]","[ユーザーID]", "[パスワード]");
        Statement stmt = con.createStatement();
        for(ResultSet rs = stmt.executeQuery("SELECT * FROM SC_SAMPLE.TA_SAMPLE "); rs.next(); Predef$.MODULE$.println(rs.getString("氏名")));
        stmt.close();
        con.close();
        Predef$.MODULE$.println("sucsess!");
    }

    public int $tag()
        throws RemoteException
    {
        return scala.ScalaObject.class.$tag(this);
    }

    public static final Sym$ MODULE$ = this;

    static
    {
        new Sym$();
    }
}




import java.sql._
とした場合には、ちゃんとmainメソッドが生成されない模様。

※私の書き方が間違ってる?


原因がわかるまでは
import java.sql.{DriverManager, Connection, Statement, ResultSet}
という書き方でインポートすることにします。




関連記事
  1. 2009/07/31(金) 14:44:16|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ