MdbCommandで利用できるSQLデータ型についてまとめます。まずは数値から。

こんにちは。
mdbファイルを操作できるMdbCommandで利用できるSQLデータ型と、
対応する.NETのクラスについてまとめます。
今回は、数値について記述します。

利用できるSQLデータ型は、ほぼMS ACCESSと同じです。

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

SQLで入力するデータ型 数値
データ型 SQLで入力する
データ型
対応する
.NETクラス
備考
TINYINT tinyint
byte
[byte] 0 〜 255 の整数
SMALLINT smallint
short
[int16] -32,768 〜 32,767 の整数
INTEGER long
int
integer
[int32] -2,147,483,648 〜 2,147,483,647 の整数
REAL real
single
[single] 4 バイトの範囲で小数
FLOAT float
double
[double] 8 バイトの範囲で小数
DECIMAL decimal
numeric
[decimal] decimal(10,5) のように指定すると整数5ケタ、少数5ケタになります
MONEY money
currency
[decimal] -922,337,203,685,477.5808 〜 922,337,203,685,477.5807 の小数

[byte]は、System.Byte型をあらわします。

MdbCommadを使って、テーブルを作成

整数
PS (1) > ipmo .\MdbCommand
PS (2) > open-mdb testdata.mdb -Create
PS (3) > invoke-mdb "create table intdata (byteA byte, shortA short, intA int)"

テーブル内の列のデータ型を調べるには、Get-MdbColumn を使用します。

PS (4) > get-mdbcolumn intdata

TableName        Pos ColumnName         DataType  AliasType Size  NotNull Default PKey AutoInc
---------        --- ----------         --------  --------- ----  ------- ------- ---- -------
intdata            1 byteA              TINYINT   byte
intdata            2 shortA             SMALLINT  short
intdata            3 intA               INTEGER   int

データを登録します。

PS (5) > invoke-mdb "insert into intdata values (1,1,1)"

データを参照します。

PS (6) > invoke-mdb "select * from intdata"

                           byteA                          shortA                            intA
                           -----                          ------                            ----
                               1                               1                               1

対応する.NETクラスを調べます。

PS (7) > invoke-mdb "select * from intdata"|get-member


   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()
byteA       NoteProperty System.Byte byteA=1
intA        NoteProperty System.Int32 intA=1
shortA      NoteProperty System.Int16 shortA=1

表にあるように、System.Byte、System.Int16、System.Int32が対応します。
System.Int64のデータは、格納するデータ型がありません。
(※SQLでlongと書いてもintになります。)

パラメータを使って、データを登録します。

PS (8) > invoke-mdb "insert into intdata values (?, ?, ?)" 2,3,4
PS (9) > invoke-mdb "select * from intdata"| ft -auto

byteA shortA intA
----- ------ ----
    1      1    1
    2      3    4

パラメータは、?で記述します。

小数
PS (10) > invoke-mdb "create table decdata (singleA single, doubleA double, decimalA decimal(10,5))"
PS (11) > Get-MdbColumn decdata

TableName        Pos ColumnName         DataType  AliasType Size  NotNull Default PKey AutoInc
---------        --- ----------         --------  --------- ----  ------- ------- ---- -------
decdata            1 singleA            REAL      single
decdata            2 doubleA            FLOAT     double
decdata            3 decimalA           DECIMAL   numeric   10,5


PS (12) > invoke-mdb "insert into decdata values (1.1, 2.22, 3.33)"
PS (13) > invoke-mdb "select * from decdata"

                         singleA                         doubleA                        decimalA
                         -------                         -------                        --------
                             1.1                            2.22                         3.33000


PS (14) > invoke-mdb "select * from decdata"|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()
decimalA    NoteProperty System.Decimal decimalA=3.33000
doubleA     NoteProperty System.Double doubleA=2.22
singleA     NoteProperty System.Single singleA=1.1

小数のほうも、System.Single、System.Double、System.Decimalがそれぞれ対応します。
get-member で見たときの並び順は、Nameの順になるので注意です。

小数もパラメータを使って、データを登録します。

PS (15) > $values = ([single]::MaxValue),([double]::MaxValue),12345.12345
PS (16) > invoke-mdb "insert into decdata values (?,?,?)" $values
PS (17) > invoke-mdb "select * from decdata"| ft -auto

     singleA               doubleA    decimalA
     -------               -------    --------
         1.1                  2.22     3.33000
3.402823E+38 1.79769313486232E+308 12345.12345
お金
PS (18) > invoke-mdb "create table moneydata (moneyA money)"
PS (19) > invoke-mdb "insert into moneydata values (29800)"
PS (20) > invoke-mdb "insert into moneydata values (199.75)"
PS (21) > invoke-mdb "select * from moneydata" | ft -auto

moneyA
------
 29800
199.75

PS (22) > invoke-mdb "select * from moneydata" | % {$_|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()
moneyA      NoteProperty System.Decimal moneyA=29800
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
moneyA      NoteProperty System.Decimal moneyA=199.75

MONEYは、System.Decimalに対応します。

次回は、文字列について記述します。

今日のコマンド

PS (1) > ipmo .\MdbCommand
PS (2) > open-mdb testdata.mdb -Create
PS (3) > invoke-mdb "create table intdata (byteA byte, shortA short, intA int)"
PS (4) > get-mdbcolumn intdata
PS (5) > invoke-mdb "insert into intdata values (1,1,1)"
PS (6) > invoke-mdb "select * from intdata"
PS (7) > invoke-mdb "select * from intdata"|get-member
PS (8) > invoke-mdb "insert into intdata values (?, ?, ?)" 2,3,4
PS (9) > invoke-mdb "select * from intdata"| ft -auto
PS (10) > invoke-mdb "create table decdata (singleA single, doubleA double, decimalA decimal(10,5))"
PS (11) > Get-MdbColumn decdata
PS (12) > invoke-mdb "insert into decdata values (1.1, 2.22, 3.33)"
PS (13) > invoke-mdb "select * from decdata"
PS (14) > invoke-mdb "select * from decdata"|gm
PS (15) > $values = ([single]::MaxValue),([double]::MaxValue),12345.12345
PS (16) > invoke-mdb "insert into decdata values (?,?,?)" $values
PS (17) > invoke-mdb "select * from decdata"| ft -auto
PS (18) > invoke-mdb "create table moneydata (moneyA money)"
PS (19) > invoke-mdb "insert into moneydata values (29800)"
PS (20) > invoke-mdb "insert into moneydata values (199.75)"
PS (21) > invoke-mdb "select * from moneydata" | ft -auto
PS (22) > invoke-mdb "select * from moneydata" | % {$_|gm}