PowerShellでsqlite3のパラメータクエリを発行

PowerShellでsqlite3を利用する記事を書いたが、SQLインジェクション対策を一切していなかった。PowerShellで作成するものの用途的に特にいらないかなと思っていたが、このご時世に対策できていないのもかっこ悪いのでSQLパラメータを利用するパターンのものを作成した。



#######################################################
# パラメータ変数格納用のクラス(SQLiteParameterだとインテリセンスやコードが長くなるため独自のクラスを作成)
#######################################################
Class clsSqlParameter {
    [string]$ParameterName;
    [object]$Value;

    # コンストラクタ
    clsSqlParameter(){

    }

    # コンストラクタ
    clsSqlParameter([string]$_ParameterName,[object]$_Value){
        $this.ParameterName = $_ParameterName;
        $this.Value = $_Value;
    }
}
   

    ############################################################
    # SQLを実行しデータを取得する。戻り値はDataTable
    # パラメータ変数を利用するので、System.Collections.Generic.List[clsSqlParameter]クラスのインスタンスを指定
    # <例>
    #  $lstParameters  = New-Object "System.Collections.Generic.List[clsSqlParameter]";
    #  $para = New-Object "clsSqlParameter" -ArgumentList "@para1", "060  ";
    #  #$para.ParameterName = "@para1";
    #  #$para.Value = "060  ";
    #  $lstParameters.Add($para);
    #   $dtResult = $dba.GetDataPara("SELECT * FROM KEN_ALL WHERE 郵便番号_5桁 = @para1 ",$lstParameters)
    ############################################################
    [System.Data.DataTable]GetDataPara([string]$strSQL,$lstParas){
        # エラーが発生した際に後続の処理を停止
        $ErrorActionPreference = "Stop"

        $sqlcmd = $null;
        $sqliteConnection = $null;
        $dataTable = $null;

        try {

            # SQLiteへの接続およびSQLステートメント発行用のSystem.Data.SQLite.SQLiteCommandの生成
            $sqliteConnection = New-Object System.Data.SQLite.SQLiteConnection;
           
            # .NETのライブラリのSQLiteは共有ファイルのデータベースへアクセスする場合、「\\SV-FOLDER\DataBase\Sample.sqlite3」のようなパスを指定したときに正常に接続できない
            # この場合は、「\\\\SV-FOLDER\DataBase\Sample.sqlite3」とする必要があることがわかったため修正
            $strConnectionString = "";
            if ($this.fstrDBFilePath.ToString().Substring(0,4) -ne "\\\\" -and $this.fstrDBFilePath.ToString().Substring(0,2) -eq "\\") {
                $strConnectionString = "Data Source = \\" + $this.fstrDBFilePath;
            } else {
                $strConnectionString = "Data Source = " + $this.fstrDBFilePath;
            }

            $sqliteConnection.ConnectionString = $strConnectionString ;
            $sqlcmd = New-Object System.Data.SQLite.SQLiteCommand;
            $sqlcmd.Connection = $sqliteConnection;
            $sqliteConnection.Open();

            # SELECT実行
            $sqlcmd.CommandText = $strSQL;
            foreach ($para in $lstParas) {
                $sqlitePara = New-Object "System.Data.SQLite.SQLiteParameter" -ArgumentList $para.ParameterName, $para.Value;
                $sqlcmd.Parameters.Add($sqlitePara);
            }
            $rs =  $sqlcmd.ExecuteReader();
           
            # Datatableにデータを取り込む
            $dataTable = New-Object System.Data.DataTable;
            $dataTable.Load($rs);
            $dataTable | Format-Table ;

        } catch {
            Write-Host "【エラー発生】GetDataPara";
            Write-Host ("エラーメッセージ:" + $_.Exception.Message);
            Write-Host ("クエリ:" + $strSQL);
        } finally {
            # SQLiteの切断
            $sqlcmd.Dispose()
            $sqliteConnection.Close()
        }
        return $dataTable;
    }

 

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...