"ODBC" の一覧

AS400のODBC性能比較520(P10)vs720(P5)

めったにないAS400のハードウェア更新があったのでODBC接続時の簡単な性能比較を実施。

image

 

ODBCドライバにはIBM System i Access for Windows V6R1を使用。クエリの内容はざっくりとしか記載していませんが、ばらつき調査も兼ねて似たようなクエリで取得元ファイルが異なるクエリを使用しました。見ていただければ判ると思いますが…体感でほとんど変わらない

 

クエリを投げてから帰ってくるまでの応答時間は約3倍高速化されているが、データの出力にかかる時間は1.2倍とほぼ変化なし。5250エミュレータ経由で720を使用すると、Page Downキーなどを連続で押しても画面の応答に遅れが発生しないといった分かりやすい効果がある。

よってハードウェアを更新するからといって過度の期待は禁物です。

CEでMySQL

MySQLの調べものをしているうちにこんなページを発見。

http://dev.mysql.com/downloads/connector/net/5.1.html

Windows CEにMySQLの接続モジュールを組み込めるということか!

 

そんなことより、ODBC5.1を使ってODBC経由で接続する際にCHAR SETをUTF8→SJISへ変換する方法未だに解決しない。Read options from my.cnfも効かないし(※この方法はWindows上でMySQLが稼働していれば効果があるのかも)。やはりODBC3.51なのか。

MySQL Query Browserでは正常に表示されるのに。

i5(AS400)でCURRENT_TIMEの区切り文字

SELECT
    CURRENT_DATE,
    CURRENT_TIME
FROM
    TESTLIB.TEST

こんなSQLを流してみると、ODBCとiSeries Access for Windowsで時刻の区切り文字が違う事を発見。日付を数値で格納しているカラムへ現在の日時を保存するためのクエリが接続方式によって若干変わります。

現在時刻→数値(hhmmss)

ODBC

CAST(REPLACE(CAST(CURRENT_TIME AS VARCHAR(10)), ‘:’ , ”) as INTEGER)

iSeries Access for Windows

CAST(REPLACE(CAST(CURRENT_TIME AS VARCHAR(10)), ‘.’ , ”) as INTEGER)

iSeries Access for Windowsでの確認はC:\Program Files\IBM\Client Access\Shared\cwbundbs.exeを使いました。※iSeries Access for Windowsインストール後に*.sqlに関連付けされていたのをプロセス名から辿って探したけどアプリ名は何なんだろう・・・

i5(AS400)の特殊文字を含むカラム名の取扱い

i5(AS400)に対してODBC経由でSELECTはもちろん、INSERT,UPDATEなどのクエリも問題なく処理できるのですがプログラムのインストールとは別にIBM iSeries Access for WindowsをインストールしODBCの接続設定をしないと動作しません。しかもODBCの接続設定名も間違っていてはいけません。

そのためiSeries Access for Windowsに含まれるIBM.Data.DB2.iSeries(.Netプログラミングサポート時にインストールされる)を利用してクエリを実行するにはどうすればよいか悩んでました。

というのも、@@TESTというカラムが存在していた場合にODBCなら[@@TEST]と記述すれば問題なかったが、iSeries Access for Windowsで同じように記述するとエラーとなる。

結局、"(ダブルクォテーション)を使えばうまく行くことがわかった。実際には"@@TEST"となる。"(ダブルクォテーション)はC#上でも特殊文字なので記述が面倒だけど。

public void UpdateTest(string sValue)
{
    const string CRLF = @"\r\n";
    StringBuilder sbSql = new StringBuilder();

    sbSql.Append("UPDATE" + CRLF);
    sbSql.Append("    TESTLIB.TEST0407" + CRLF);
    sbSql.Append("SET" + CRLF);
    sbSql.Append("    \"@@TEST2\" = @TEST2" + CRLF);
    sbSql.Append("WHERE" + CRLF);
    sbSql.Append("    \"@@TEST1\"= @TEST1" + CRLF);

    try
    {
        using (iDB2Connection cn = new iDB2Connection(DataSource=192.168.xxx.xxx;USERID=(ユーザー名);PASSWORD=(パスワード);))
        {
            cn.Open();
            using (iDB2Command cmd = cn.CreateCommand())
            {
                sbSql = sbSql.Replace(CRLF, " ");
                cmd.CommandText = sbSql.ToString();
                
                Debug.WriteLine(sbSql.ToString());

                cmd.Parameters.Add("@TEST1", iDB2DbType.iDB2Char);
                cmd.Parameters.Add("@TEST2", iDB2DbType.iDB2Char);

                cmd.Parameters["@TEST1"].Value = "(更新対象レコードのキー)";
                cmd.Parameters["@TEST2"].Value = sValue;

                cmd.ExecuteNonQuery();
            }
            cn.Close();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

※AppendLineを使用していないのは、WindowsCEとソースを共有している為です。あと\は実際には円マークです。

Tuigwaaその後

Tuigwaaについて検証を続けていたが、Tomcat上でHSQLからPostgressへDBを変更し本格的に稼働させようと努力はしてきた。が、残念ながらこれの進展は望めないという事で運用は中止する事にした。

その一番の原因は、

PostgressへDB移行後にSlide(ページ一覧)が表示されない問題への対処ができない

でした。あとは、

情報が少ない
HSQLのままではODBCが利用できない
開発打ち切り
Postgressでの運用時のバグがOpenのまま

中小企業での情報共有にかなり有効だと分かっていただけに残念。それだけで終わってしまうのはあれなのでODBCを利用して各DBの内容をてっとり早く表示する方法の概要だけ書きます。

DotNetNuke内に含まれるReportモジュールが恐ろしく高機能でODBC経由でどこのデータでも表示する事ができます。SQL Serverはもちろん、MySQLやAS400内のDB2もOKです。ただしSELECT文が書ける事が前提になるのでユーザーに解放する事はできません。入力画面も別途必要になります。

※DotNetNukeは5.0になってからSorceForgeにソースが無い。ライセンス変わったのかな。とりあえず新規で試す方がいるなら4.9.0にした方が日本語化や情報も多いはず。

AS400とのODBC接続時にSQL0666エラー(タイムアウト)

ちょっと時間がかかるクエリを投げたら、「SQL0666 – SQL QUERYが指定された時間制限または記憶制限を超えています。 」とi5に言われた。

前に解決方法を書いていたが、画像のリンクが切れていたので再度投稿。

※iSeries Access for WindowsのODBCドライバを利用しています。

image 管理ツールのODBCより、構成画面を開く。

パフォーマンスタブを選択し、下部にある拡張ボタンを押す

image 「照会タイムアウトを使用可能にする」のチェックボックスを外す。

AS400でCWBSY0011エラー

AS400でQSECOFRでログインできなくなった。iSeries AccessのODBCや5250エミュレータでCWBSY0011エラーが発生。手動で電源を切った後コンソールでログインしていないから?

WRKUSRPRF QSECOFR

にて状況を*DISABLEDを*ENABLEDに変更すると解決した。プリンタセッションからSQL Serverへのテーブルコピーまで使い回していたのでエライ事に。しかし情報少ない(ググって1件のみ)。下記サイトのおかげで助かりました。ありがとうございます。

参考サイト

DotNetNukeのReportモジュールでエラー

社内向けポータルサイトをDotNetNukeで構築したいと思わせるもっとも魅力的なモジュールがReportモジュールだと思います。

DBを自由に指定する事ができ、クエリ内容を出力する事ができます。ただ、SQL Serverとの接続は全く問題ないが、MySQLでは内部エラーが発生してしまう。クエリに”SELECT 1”と指定すると、正常に繋がるのに。

※MySQLのODBC Driverは5.1を使用

image

Connection Stringの欄には下記を指定。

Provider=MSDASQL;dsn={ODBC設定名};uid=user;pwd=password;

試しにMySQLを3.51にしてみると正常に処理できた。違う点といえば明示的なCHAR SETが5.1ではする場所が無い事か?
ということで、MySQL3.51を使えばDotNetNukeのReportモジュールで使用できる事が判明!