SikuliX:SQL Serverのストアドを実行する

シナリオ

  • DBサーバ:localhost
  • DB名:SikuliX
  • テーブル:車名コードの コード:296 の車名表示名と車名英文字を取得
  • JDBCドライバはMSからダウンロードしmssql-jdbc-x.x.x.jre8.jarをc:¥jdbcにコピーしておく
※SikuliXバグ情報
 sikulix1.1.4以降のloadコマンドにバグがある模様。
 https://bugs.launchpad.net/sikuli/+bug/1789569 
 2.1でFix予定らしい。2.0.4ではOK 2.0.4でもだめな場合があった。
 回避策:下記フォルダにmssql-jdbc-x.x.x.jre8.jarをコピー後IDEを起動し直すと自動でロードする
 ※AppDataは隠しファイルなので表示できるように設定する(エクスプローラ>表示タブ>隠しファイル)
 C:\Users\<ユーザー名>\AppData\Roaming\Sikulix\Extensions

 2.0.1ではこの回避策ではNGだった。クラスNot Foundになる。
java.lang.ClassNotFoundException ( java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver ) 

サンプルコード

load("C:\jdbc\mssql-jdbc-9.2.0.jre8.jar") # ←ここでJDBCドライバをロードしておく
import sys
from java.lang import Class 
from java.sql import DriverManager
from java.sql import PreparedStatement

reload(sys)
sys.setdefaultencoding("utf-8")

dbuser = "ユーザー名"
dbpassword = "パスワード"
url = "jdbc:sqlserver://localhost;database=SikuliX;" + "user=" + dbuser + ";password=" + dbpassword
driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"

Class.forName(driver).newInstance()
cn = DriverManager.getConnection(url)
sql = u"{call TestSp(?)}"

try:
    st = cn.prepareCall(sql)
    st.setInt(1, 296)
    st.execute()
    rs = st.getResultSet()
    while rs.next():
        print rs.getInt(u"コード"), rs.getString(u"車名表示名"), rs.getString(u"車名英文字") 
except Exception, e:
    print e.args[0]
finally:
    rs.close()
    st.close()
    cn.close()

結果

296 ホンダ HONDA