A THINKING FRUIT
概要
データベースのテーブルへレコードを追加する。CSV形式をインポートする。
使用ファイル一覧
1.
DB-Import-CSV.ps1
データベース・インポータ。
2.
LibDb.ps1
データベース・アクセス・ライブラリ for Oracle 。
実行方法
PS D:\dev> DB-Import-CSV product
product はテーブル名。
カレントディレクトリの <テーブル名> + ".csv" ファイルから取り込む。
PowerShell ソース
Param
(
[String]
$strTableName
)
Function
Set-Param-Value(
[DbCtl]
$dbctl
, [String[]]
$columns
) {
Begin
{
$nIndex
=
0
}
Process
{
$columnIndex
=
$nIndex
++
$strPlaceholderId
=
':{0}'
-f
$nIndex
$columnValue
=
$columns
[
$columnIndex
]
if
(
$columnValue
.EndsWith(
'"'
)
-band
$columnValue
.StartsWith(
'"'
) ) {
$columnValue
=
$columnValue
.Substring(
1
,
$columnValue
.Length -
2
) }
'placeholder:{0}, value={1}'
-f
$strPlaceholderId
,
$columnValue
$dbctl
.SetParam(
$strPlaceholderId
,
$columnValue
) } }
Function
Import-CSV(
[DbCtl]
$dbctl
,
$strTableName
) {
Begin
{
$bFirst
=
$True
$header
=
''
$columns
=
$Null
}
Process
{
$line
=
$_
if
(
$bFirst
) {
$bFirst
=
$false
$header
=
$line
.Split(
','
)
$columns
=
1
..
$header
.Count | %{ (
':'
+
$_
) } | One-Line
','
4096
$strSql
=
'insert into '
+
$strTableName
+
'('
+
$line
+
')values('
+
$columns
+
')'
$strSql
$dbctl
.AttachCommand(
$strSql
)
return
}
$columns
=
$line
.Split(
','
)
1
..
$header
.Count | Set-
Param
-Value
$dbctl
$columns
$dbctl
.cmd.ExecuteNonQuery() }
End
{ } }
Function
One-Line (
[String]
$strSeparator
,
[System.Int32]
$nCapacity
) {
Begin
{
$sb
=
[System.Text.StringBuilder]
::new(
$nCapacity
,
$nCapacity
)
$strSeparator2
=
''
}
Process
{
[void]
$sb
.Append(
$strSeparator2
)
$strSeparator2
=
$strSeparator
[void]
$sb
.Append(
$_
) }
End
{
$sb
.ToString() } }
Function
Column-Value {
Process
{
$Value
=
$_
if
(
$Value
-eq
$Null
) {
return
''
}
switch
(
$Value
.GetType() ) { {
$_
-eq
[String]
} {
'"'
+
$Value
+
'"'
} {
$_
-eq
[Int32]
} {
$Value
.ToString() } {
$_
-eq
[Decimal]
} {
$Value
.ToString() } {
$_
-eq
[Byte[]]} {
'"'
+ (
$Value
| To-Hex) +
'"'
} {
$_
-eq
[DateTime]
} {
'"'
+
$Value
.ToString(
'yyyy/MM/dd HH:mm:ss'
) +
'"'
} {
$_
-eq
[DBNull]
} {
''
}
default
{
throw
[System.Exception]
::new(
'指定された値は未対応の型です'
) } } } }
if
(
$strTableName
.Length
-eq
0
) {
return
}
$connectionStrings
= @{ server =
'localhost:1521'
; id =
'user'
; pw =
'pass'
; };
[void]
[reflection.assembly]
::LoadWithPartialName(
'System.Data.OracleClient'
) . LibDb
$DbCtl
=
$Null
try
{
$DbCtl
=
[DbCtl]
::new(
$connectionStrings
.server,
$connectionStrings
.id,
$connectionStrings
.pw)
$strInputPath
=
'{0}.csv'
-f
$strTableName
try
{
$dbCtl
.BeginTransaction() Get-Content -Path
$strInputPath
-Encoding Default | Import-CSV
$DbCtl
$strTableName
$dbCtl
.Commit() }
catch
{
$dbCtl
.Rollback() } }
catch
{
throw
}
finally
{
$DbCtl
.Dispose() }