# アセンブリの読み込み
Add-Type -Assembly System.Windows.Forms
# グリッドデータを保持するDataSetとDataTable
$dataSet1 = New-Object System.Data.DataSet
$dataTable1 = New-Object System.Data.DataTable

$dataRow = $dataTable1.NewRow()
$dataSet1.Tables.Add($dataTable1)

$wsobj = new-object -comobject wscript.shell
Function Get-ExcelBook($BookName)
{

    #=== 稼働中の Excel を捕まえる
    $ex = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")

    if ($ex -eq $null) { return $null }

    #=== Open中のWorkBookから目的のBookを見つける
    foreach ($bk in $ex.WorkBooks)
    {
        if ($bk.Name -eq $BookName)# 見つかった!
        {
            Write-Host $bk.name;
            return $bk
        }
    }
    Write-Host "ない";
    return $null
}
function Get-ClipBoard
{
    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Paste()
    $tb.Text -replace "`r`n","`n" -replace "`r","`n"  -split "`n"
}

#稼働中のエクセルを捕まえる
$ex = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")
#$bk = Get-ExcelBook("個人的アドインツール.xlam");
$sheet = $ex.Workbooks.Item("個人的アドインツール.xlam").Worksheets.Item("PowerShell")
$conStr = $sheet.Range("Connect").Text
$sqlStr = $sheet.Range("Sql").Text
$SelectDB = $sheet.Range("SelectDB").Text
#メッセージボックス
#$result = $wsobj.popup($conStr)
#$result = $wsobj.popup($sqlStr)
#$result = $wsobj.popup($SelectDB)
$sqlCountStr = "SELECT COUNT(*) AS MAXCNT FROM (" + $sqlStr + ") DATA"

switch($SelectDB)
 {
     #PowerShell + ADO.NET + Oracle
     "Oracle" {
         [void][Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")
         #$conStr = "Data Source=ORCL;User ID=scott;Password=tiger"
         $con = New-Object System.Data.OracleClient.OracleConnection($conStr)
         $cmd = New-Object System.Data.OracleClient.OracleCommand($sqlStr, $con)
         $cmdCnt = New-Object System.Data.OracleClient.OracleCommand($sqlCountStr, $con);
     }
     #PowerShell + ADO.NET + SQL Server
     "SQLServer" {
         #$conStr = "SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd"
         $con = New-Object System.Data.SqlClient.SqlConnection($conStr);
         $cmd = New-Object System.Data.SqlClient.SqlCommand($sqlStr, $con);
         $cmdCnt = New-Object System.Data.SqlClient.SqlCommand($sqlCountStr, $con);
     }
     #PowerShell + ADO.NET + OLE DB + Jet データベース
    "mdb" {
         #$conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=hello.mdb;"
         $con = New-Object System.Data.OleDb.OleDbConnection($conStr)
         $cmd = New-Object System.Data.OleDb.OleDbCommand($sqlStr, $con)
         $cmdCnt = New-Object System.Data.OleDb.OleDbCommand($sqlCountStr, $con);

    }
     #PowerShell + ADO.NET + OLE DB + ACE データベース
    "accdb" {
         #$conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=hello.accdb;"
         $con = New-Object System.Data.OleDb.OleDbConnection($conStr)
         $cmd = New-Object System.Data.OleDb.OleDbCommand($sqlStr, $con)
         $cmdCnt = New-Object System.Data.OleDb.OleDbCommand($sqlCountStr, $con);
     }
     default {Write-Output ("登録されている以外の名前が入力されました。")}
 }

 $ex.StatusBar = "SQL実行中"
 $con.Open()
 $readerCnt = $cmdCnt.ExecuteReader()
 $readerCnt.read()
 $Count = $readerCnt[0]
 $result = $wsobj.popup($readerCnt.FieldCount)
 $readerCnt.Close()
 $reader = $cmd.ExecuteReader()
 #$result = $wsobj.popup($reader.FieldCount)
 $Head = ""
 $Data = ""
 $Flg = ''
 $Cnt = 0
 #フィールド名出力
 for ( $i = 0; $i -lt $reader.FieldCount; $i++ )
{
    $dataTable1.Columns.Add($reader.getName($i), [string])
}
$Cnt = 1
 #データ出力
 while ( $reader.read() )
 {
    $dataRow = $dataTable1.NewRow()
    for ( $i = 0; $i -lt $reader.FieldCount; $i++ )
    {
        $dataRow.Item($i) = $reader[$i].ToString()

    }
    $Cnt =  $Cnt + 1
    $ex.StatusBar = [string]($Cnt+1) +" / " + [string]$Count + "件処理中"
    $dataTable1.Rows.Add($dataRow)
 }

 $ex.StatusBar = "抽出完了"
 $con.Close()
 $dataView =  New-Object System.Data.DataView($dataTable1)
 $dataSet1.Tables | Select-Object -ExpandProperty Rows | Out-GridView