未保存のブログ(あたためますか?)

勉強したいことも含めて書いていく備忘録的なもの。 主にWindowsで、できるだけ管理者じゃなくてもできそうなことをプログラミング中心に書いていきます。

SQLite

茨の道を行く「なでしこ」プログラミング - 2回:SQLite3でグリッドアプリ

1回目から茨の道を行くといいつつ、それほどでもないので一気にDB利用プログラミングをしてみようかと思います。

完成したもの



こんなやつです。

201510051420-001


グリッドのみを使用したデスクトップアプリケーションです。
デスクトップに置かれた「sample.db」というSQLite3のデータベースファイルを起動したときに読み取ってグリッドに表示するというシンプルなものです。

茨の道



何が辛いところがあるか、あまりないのですが(おい)。
強いて言うとSQLite3はデータベースの文字コードがUTF-8で、なでしこはShift-JISですよね。
今回のサンプルでは日本語を使っていないデータなので別に気にしなくてもいいのですが、実際には日本語を使いたくなるのが世の常でしょう。

ということで、そういう場合のためにあらかじめ用意された命令がありまして。
「SQLITE3自動変換」というやつです。

命令から探すことができるので、なんの命令なのかわかっておけば全く困りません。

201510051420-002


あとは「SQLITE3自動変換 = オン」とするか「SQLITE3自動変換はオン」としとけばよしなにしてくれます。
素晴らしい。

サンプルコードでは文字列結合してDBファイルのパスを指定していますが、よく考えたら{}を使うと変数展開できるなーと。

だから、


DB = デスクトップ & 「sample.db」


というコードは


DB = 「{デスクトップ}sample.db」


と書いても大丈夫です。

個人的にちょっときになるのは、「デスクトップ」というデスクトップのパスを返す命令がどうもしっくりこないことですかね。
別に悪くはないのですが…

このほか、DBのハンドルを変数Hとして使っていますが、なくても文脈から読み取ってうまいことやってくれますので大丈夫です。

最後に、サンプル用のDBに「user」テーブルとしてテーブルを用意してたつもりが「sample」で作ってて、気づかずに何度も実行時エラーが発生してました…

なでしこで例外処理をするには「エラー監視」という命令を使いましょう。
使ったほうがよかったな…
これを入れておくと、「エラーならば」で例外を捕捉したときに「エラーメッセージ」という命令でエラーの内容を表示するなりできます。

ということでサンプルコードです。


※※※積み木デザイナ:ここから※
※ 以下はデザインデータです。
※ コメントを削除しないようにしてください。
※ ---
※母艦とはフォーム##生成
母艦は「メインフォーム」
そのクライアントW=640#数値
そのクライアントH=400#数値
そのタイトル=「SQLITE3サンプル」#文字列
※ ---
グリッド1とはグリッド##生成
そのX=8#数値
そのY=8#数値
そのW=108#数値
そのH=232#数値
そのテキスト=「グリッド1#文字列
そのアイテム=「」#文字列
※※※積み木デザイナ:ここまで※

DBとは文字列
DB = デスクトップ & 「sample.db」
SQLとは文字列
SQL = 「select * from sample;」
SQLITE3自動変換はオン

H = DBをSQLITE3開く
HでSQLをSQLITE3実行
グリッド1のアイテムはそれ
HのSQLITE3閉じる


ところで、グリッドのアイテムとしていきなり結果を投入しています。
これは「SQLITE3実行」という命令が返すのがCSV形式の文字列だからです。
つまり、データの中にカラム名も含まれてしまうのです。
カラム名ではなくて、日本語名なんかをグリッドなんかに表示したいなーと思うときは一行目をスキップするかしないとデータとして含まれてしまいます。

また、「SQLITE3実行」が返すCSVを個別に加工したいときは一度「CSV取得」命令を使って二次元の配列にします。
ハッシュにもできるのですが、ちょっと面倒ですよね…

SQL文と配列の添え字で管理するようになるのが辛いところです。

とはいえ、なでしこは二次元配列でも「表行列交換」なんていう便利命令もありますので、工夫次第でなんとかなるかもしれません。

いまさらPowerShellでSQLite使えるのかやってみた3

昨日からiPhoneでCodeZine読みながらPowerShellの勉強を始めた。
やはり、書いてみないとわからないっすね。

私のマシンはXPなのでXP用の2.0をインストールした。

ちょっといじってみたけど、いろいろできる。
もともと管理用のシェルスクリプトが弱い部分を補強というか異様なまでに増強しているせいか、プログラミングするために開発されているようないないような。
まず驚いたのは以下の点。観点バラバラ。
  1. パイプが使えるけど、わたってくるのはオブジェクト
  2. オブジェクトは.Netのオブジェクト
  3. スクリプトファイルは拡張子「ps1」
  4. スクリプトファイルは実行ポリシーを変更しないと使えない
  5. 実行ポリシーはVista以降だと管理者権限がないと変更できない
ということで、無理やり始める。

個人的にSQLiteが使いたいので、まずはそこから。
開いて閉じるだけを書いてみる。

環境はWindowsXP Professional SP3
PowerShellはバージョン2.0、SQLiteへのアクセスは「System.Data.SQLite」を利用しました。
[void][System.Reflection.Assembly]::LoadFrom("{パス}\System.Data.SQLite.DLL")

function open-sqlite(){
    $conn = New-Object System.Data.SQLite.SQLiteConnection("Data Source={パス}\Test.db")
    $conn.open()
    $conn.close()
}

open-sqlite
いやー、これだけですけどちゃんと動いた。
{パス}のところは適当に自分の環境に変更します。
最後に関数が書いてあるのは、プロファイルに関数登録とかできるらしいけど、ISE上で試しただけなので手抜きです。

以下、参考にさせていただいたところ。

SQLiteを使ったC#開発が楽チンだなぁと思うたったひとつのこと3

メンバーからの依頼で、C#のちょこっとツールを作った。
なんかせっかくなので勉強がてらSQLiteを使ってみようと思い、やってみた。

まずはC#での使い方を知らなかったのでググる。
C#からSQLiteを使ってみた
なるほど。System.Data.SQLiteを使えばいいんですな。

普通にダウンロードしてきた。
今回はDLLだけあればよさげなので、バイナリのzipだけ。
展開してみるといろいろあるが、System.Data.SQLite.DLLというのがあるのね。これでしょう。
VisualStudio2008でC#のプロジェクトを作って、参照設定からこのDLLを指定してやる。

あとは使うだけ。

でも、データ投入はどうすんのよ。
と思ったけどFireFoxのアドオンにすごいのがありました。
SQLite Manager。
これでやるとCreate Tableもできるし、日本語通るし、CSVインポートもできるし、、、、
便利すぎる。

すごいですね。

しかし、来月からはVS2008がない…

JScriptからSQLiteを操作する3

さて、ほんとに開発環境を導入できない職場に移りそうになってきた。 なのでちょっとペースアップしないとね。 今回はひとつ残念なことにSQLiteのODBCドライバーをインストールしなきゃいけない、という制約がある。 異動先で越えられるハードルなんだろうか… そんなわけで、とりあえず。 SQLiteをJavaScriptから操作するには、ADOの技術を使うみたい。 COMだね。COM。 セキュリティ云々がありますが、何もないところで何かをするので別の方法を思いつくまでの暫定ということで。 順番は次のとおり。
  1. SQLite ODBCドライバーをインストールする
  2. new ActiveXOBject("ADODB.Connection");でオブジェクトを作る
  3. 作ったオブジェクトからSQLを発行する
  4. 後片付け
SQLite ODBCドライバーのインストール sqliteodbc001 sqliteodbc002 sqliteodbc003 sqliteodbc004 sqliteodbc005
やってみた感じでは、先に空であっても、ファイルがないとcreate tableが動作しないようなので作っておく必要があるよ!
(function(){
    // SQLiteを操作してみるサンプル
    // あんまり何も考えずにテーブルを作る
    var neru3ne = function(){
        
        // DBファイル
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var dbf = "sample.db";
        var dbfPath = WScript.ScriptFullName.replace((new RegExp(WScript.ScriptName,"g")),"");
        // ADODB
        var db = new ActiveXObject("ADODB.Connection");
        var driver = "DRIVER=SQLite3 ODBC Driver;Database=" + dbfPath + "\\" + dbf ;
        var createSql = "CREATE TABLE IF NOT EXISTS sample (id TEXT, name TEXT, age TEXT);";
        var insertSql = "INSERT INTO sample VALUES ('1','motoki','30');";
        var selectSql = "SELECT * FROM sample;";


        this.create = function(){
            if(!fso.FileExists(dbfPath + dbf)){
                // ファイルを作っておく
                fso.CreateTextFile(dbfPath + dbf,false);
            }

            db.Open(driver);
            db.Execute(createSql);
            db.Close();
        };
        
        this.insert = function(){
            db.Open(driver);
            db.Execute(insertSql);
            db.Close();
        };
        
        this.select = function(){
            db.Open(driver);
            var rs = db.Execute(selectSql);
            WScript.echo(rs.Fields(0).value.toString() 
                         + "\t" + rs.Fields(1).value.toString()
                         + "\t" + rs.Fields(2).value.toString());
            rs.Close();
            rs = null;
            db.Close();
        };
        
    };

    // entry point
    var aaa = new neru3ne();
    aaa.create();
    aaa.insert();
    aaa.select();
})();
うまく実行できるとこんな感じ。 sqliteodbc006
もうちょっと実用的なものをまた書きます。
広告
livedoor プロフィール

motoki_8791

プログラマ→SE屋→プロマネ→オペレータ→コンサルまがい→フリー(いまココ)
VBA,VBScript,PowerShell,C#,Python,Groovy,ruby,Javascript,などなど、そのとき必要に駆られて覚えたことで暮らしています。
PowerShellは電子書籍も出版しました。よろしければ。
はじめよう Windows PowerShell