MdbCommandで利用できるSQLデータ型について。次は、文字列です。

こんにちは。
ここで、もう一度MdbCommandについてお知らせします。

MdbCommandは、Windows PowerShellで記述されたモジュールで、mdbファイルをPowerShellで操作するためのものです。
テーブルの作成や参照などの機能のほかに、プログラミングに利用することができるようになっています。

以下で、ダウンロードできます。

GitHub

GitHub - rancomma/MdbCommand: powershell ms mdb file automation command.

  • Windows PowerShellは、Windows7から標準でスタートメニューの「アクセサリ」に入っています。
  • XPでも、Windowsアップデートを行うとインストールされるようです。
  • インストールされていない場合は、Microsoftのサイトからダウンロード出来ます。
  • モジュールは、PowerShell version2 から導入されたもので、コマンドを簡単に増やしたりできる仕組みです。
  • Windows7PowerShellのヴァージョンは、version2です。
  • mdbファイルは、Office Accessデータベースに利用されてるファイルで、Office Access2003までの形式に対応しています。
  • Office Access2007や、Office Access2010は、Accdbファイルになりますが、mdbファイルも利用できます。
  • WindowsXPや7では、mdbファイルを操作するためのライブラリが標準で入っています。
  • MdbCommandを利用するのに、Office Accessは、必須ではありません。

SQLで利用できるデータ型 文字列

それでは、SQLで利用できるデータ型の文字列についてお話します。

◆MS ACCESSSQL データ型
http://office.microsoft.com/ja-jp/access-help/HP001032248.aspx?CTT=5&origin=HP001032229

SQLで入力するデータ型 文字列
データ型 SQLで入力する
データ型
対応する
.NETクラス
備考
VARCHAR varchar
string
[string] 0 〜 255 バイトの文字列
CHARACTER character
char
[string] 0 〜 255 バイトの文字列で、文字が無いところはスペースで埋まります。
TEXT text
memo
[string] 0 〜 2.14 GB の文字列

[string]は、System.String型をあらわします。


MdbCommand をインポートします。

PS (1)  > ipmo .\MdbCommand

前回作成した、testdata.mdbをオープンします。
PassThru スイッチパラメータを指定すると、オープンした結果が返ってきます。

PS (2)  > Open-Mdb testdata.mdb -PassThru

結果

DatabaseName State  Transaction DataSource
------------ -----  ----------- ----------
main         Open   No          C:\scripts\ps1\testdata.mdb

前回作成したテーブルの一覧を参照します。Get-MdbTable コマンドを実行します。

PS (3)  > get-mdbtable

結果

TableName                  TableType  Description
---------                  ---------  -----------
decdata                    TABLE
intdata                    TABLE
moneydata                  TABLE

文字列のデータ型を使ってテーブルを作成します。

PS (4)  > invoke-mdb "create table strdata (varcharA string(50), charA char(50), memoA memo)"

作成したテーブルの列情報を参照します。

PS (5)  > get-mdbcolumn strdata

結果

TableName        Pos ColumnName         DataType  AliasType Size  NotNull Default PKey AutoInc
---------        --- ----------         --------  --------- ----  ------- ------- ---- -------
strdata            1 varcharA           VARCHAR   string    50
strdata            2 charA              CHARACTER char      50
strdata            3 memoA              TEXT      memo

文字列のデータを登録します。

PS (6)  > invoke-mdb "insert into strdata values  ('あいう', '123', '漢字')"

テーブルの中身を見てみます。

PS (7)  > invoke-mdb "select * from strdata"

結果

varcharA                                          charA                                             memoA
--------                                          -----                                             -----
あいう                                            123                                        ... 漢字

charAの最後が「...」になっていますが、データが後ろにまだ何かあることを示しています。
あとで、何文字あるか確かめます。

対応している.NETクラスの型を調べます。

PS (8)  > invoke-mdb "select * from strdata" |gm

結果

   TypeName: MdbCommand.MdbRecord

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
charA       NoteProperty System.String charA=123
memoA       NoteProperty System.String memoA=漢字
varcharA    NoteProperty System.String varcharA=あいう

すべて、System.String型です。


それぞれ、何文字あるか、SQLで調べてみます。ここでは、len関数を使っています。

PS (9)  > invoke-mdb "select len(varcharA),len(charA),len(memoA) from strdata" | ft -auto

結果

Expr1000 Expr1001 Expr1002
-------- -------- --------
       3       50        2

varcharは3文字、charは50文字、memoは2文字になりました。

charAの後ろは何が入っているか調べます。
まず、SELECT文の結果を、row変数に代入して、charAの中身を見てみます。

PS (10) > $row = invoke-mdb "select * from strdata"
PS (11) > "[" + $row.charA + "]"

結果

[123                                               ]

スペースのようです。

すぺースをアンダースコア(_)に変えてみます。

PS (12) > "[" + $row.charA + "]" -replace " ","_"

結果

[123_______________________________________________]

このような感じで、charは固定サイズ、varchar(string)は、可変サイズになっています。
memoは、255文字を超える場合に使うことになると思います。

最後にmdbファイルを閉じます。

PS (13) > close-mdb

次回は、残りのデータ型(日付やYES/NOやバイナリ)を記述します。

今日のコマンド

PS (1) > ipmo .\MdbCommand
PS (2) > Open-Mdb testdata.mdb -PassThru
PS (3) > get-mdbtable
PS (4) > invoke-mdb "create table strdata (varcharA string(50), charA char(50), memoA memo)"
PS (5) > get-mdbcolumn strdata
PS (6) > invoke-mdb "insert into strdata values ('あいう', '123', '漢字')"
PS (7) > invoke-mdb "select * from strdata"
PS (8) > invoke-mdb "select * from strdata" |gm
PS (9) > invoke-mdb "select len(varcharA),len(charA),len(memoA) from strdata" | ft -auto
PS (10) > $row = invoke-mdb "select * from strdata"
PS (11) > "[" + $row.charA + "]"
PS (12) > "[" + $row.charA + "]" -replace " ","_"
PS (13) > close-mdb