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() }