2010年1月6日水曜日

Windows Power Shellを使って、SQL-Server 2008のデータ型に対応した、DataTableのデータ型を調べてみる

今回の記事では、タイトル通りなのですが、Windows Power Shellを使い、SQL-Server 2008のデータ型に対応した.NET Frameworkライブラリの「DataTable」のデータ型を調べてみます。

Windows Power Shell上で、自作のコマンド(関数)「CheckType」を入力すると、
型の対応表がCSV形式でもって、C:\Test\Type.txtファイルに出力される・・・という方法でやってみました。



-- 最初に行うSQL-Server 2008 (Express)側の準備
-- ******************************************
-- 主要な型だけを集めたダミーテーブルを作る
-- ******************************************
CREATE TABLE ##T_TYPE
(
"binary " binary,
"timestamp " timestamp,
"varbinary " varbinary,
"bit " bit,
"tinyint " tinyint,
"date " date,
"datetime " datetime,
"datetime2 " datetime2,
"datetimeoffset " datetimeoffset,
"decimal " decimal,
"money " money,
"smallmoney " smallmoney,
"float " float,
"uniqueidentifier" uniqueidentifier,
"smallint " smallint,
"int " int,
"bigint " bigint,
"real " real,
"varchar " varchar,
"char " char,
"nchar " nchar,
"ntext " ntext,
"text " text,
"nvarchar " nvarchar,
"time " time,
"xml " xml
);

--ダミーデータの挿入
INSERT INTO ##T_TYPE("int ") VALUES(111111);



Windows Power Shell側で用意するコマンド(関数)

function global:CheckType()
{
[Data.SqlClient.SqlConnection]$obj_con = $null;
[Data.SqlClient.SqlCommand]$obj_cmd = $null;
[Data.SqlClient.SqlDataAdapter]$obj_adp = $null;
[Data.DataSet]$obj_ds = $null;
[Data.DataTable]$obj_tbl = $null;
[IO.StreamWriter]$obj_W = $null;
[Text.Encoding]$enc_sjis = $null;
[Int32]$i = 0;
[String]$str_rec = "";
try
{
$obj_con = $(New-Object Data.SqlClient.SqlConnection("接続文字列"));
$obj_cmd = $(New-Object Data.SqlClient.SqlCommand);
$obj_adp = $(New-Object Data.SqlClient.SqlDataAdapter);
$obj_ds = $(New-Object Data.DataSet);
$obj_tbl = $(New-Object Data.DataTable);
$obj_con.Open(); #接続開始
$obj_cmd.CommandType = 1; #Text
$obj_cmd.CommandTimeOut = 60;
$obj_cmd.CommandText = "SELECT * FROM ##T_TYPE;";
$obj_cmd.Connection = $obj_con;
$obj_adp.SelectCommand = $obj_cmd;
$obj_ds.EnforceConstraints = $false;
$obj_adp.Fill($obj_ds);
$obj_ds.EnforceConstraints = $true;
$enc_sjis = [Text.Encoding]::GetEncoding("Shift_JIS");
$obj_W = $(New-Object IO.StreamWriter("C:\Test\Type.txt",$false,$enc_sjis));
$obj_tbl = $obj_ds.Tables[0];
$obj_W.WriteLine("SQL-Server型 ,DataTableのデータ型");
#@@@@@@@@@@[LOOP-START]@@@@@@@@@@
for($i=0; $i -lt $obj_tbl.Columns.Count; $i++)
{
#データ型を全てShift_JIS形式テキストファイルに出力する。
$str_rec = $($obj_tbl.Columns[$i].ToString()) + ",";
$str_rec+= $($obj_tbl.Columns[$i].DataType.ToString());
$obj_W.WriteLine($str_rec);
}
#@@@@@@@@@@[LOOP-END ]@@@@@@@@@@
}
catch [Exception]
{
Write-Output $Error[0].ToString();
}
finally
{
$obj_W.Close();
$obj_W.Dispose();
$obj_con.Close();
$obj_con.Dispose();
$obj_cmd.Dispose();
$obj_adp.Dispose();
$obj_ds.Dispose();
}
}



コマンドの実行結果(テキストファイルに出力)

SQL-Server型 ,DataTableのデータ型
binary ,System.Byte[]
timestamp ,System.Byte[]
varbinary ,System.Byte[]
bit ,System.Boolean
tinyint ,System.Byte
date ,System.DateTime
datetime ,System.DateTime
datetime2 ,System.DateTime
datetimeoffset ,System.DateTimeOffset
decimal ,System.Decimal
money ,System.Decimal
smallmoney ,System.Decimal
float ,System.Double
uniqueidentifier,System.Guid
smallint ,System.Int16
int ,System.Int32
bigint ,System.Int64
real ,System.Single
varchar ,System.String
char ,System.String
nchar ,System.String
ntext ,System.String
text ,System.String
nvarchar ,System.String
time ,System.TimeSpan
xml ,System.String



この型の違いは、たとえぱ、SQL CLRでストアドプロシージャを組む時なんかに役立ちそうですね。

それにつけても、昨年購入したモバイルノートの「Aspire 1410」ですが、64bit Windows7と共に、本当にお役立ちです。
SQL-Server 2008 Expressも、Visual C# 2008 Expressも、バリバリ使えますし。
勉強目的で購入したはずなのに、いつの間にかメインマシンになってますよ!!