【问题标题】:Progress Bar for $command.ExecuteReader() in PowershellPowershell 中 $command.ExecuteReader() 的进度条
【发布时间】:2019-11-22 15:37:59
【问题描述】:

我想知道是否可以为 $command.ExecuteReader() 创建进度条。

这里是场景

我有一个基于输入文件创建插入查询的 powershell 代码。

查询保存在变量上(4 个不同变量中的 4 个查询语句)

在实际执行针对 ORACLE 数据库的查询的代码下方。

[System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient") | Out-Null
$connectionString = "User Id=USER;Password=PASS;Data Source=DATA_SOURCE;"
$connection = New-Object System.Data.OracleClient.OracleConnection($connectionString)
$connection.Open()
foreach($query in (Get-Variable -Name str_query*)){
    $command = New-Object System.Data.OracleClient.OracleCommand -ArgumentList $query.Value, $connection  
    $reader = $command.ExecuteReader()
}

查询正在运行,数据实际上已插入到正确表的数据库中。有关 Powershell 代码和 Oracle 代码的一切都按预期工作。

我想为 $reader 实现一个写入进度。这可能吗?

【问题讨论】:

    标签: oracle powershell


    【解决方案1】:

    您可以在查询完成后为您的查询写一个Write-Progress

    你还需要一个计数器来告诉Write-Progress你已经走了多远,这取决于查询的数量。

    [System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient") | Out-Null
    $connectionString = "User Id=USER;Password=PASS;Data Source=DATA_SOURCE;"
    $connection = New-Object System.Data.OracleClient.OracleConnection($connectionString)
    $connection.Open()
    $queries = Get-Variable -Name str_query*
    foreach($query in $queries){
        $command = New-Object System.Data.OracleClient.OracleCommand -ArgumentList $query.Value, $connection  
        $reader = $command.ExecuteReader()
    
        $i = $i+1
        Write-Progress -Activity "Executing Queries" -Status "Progress:" -PercentComplete ($i/$queries.count*100)
    }
    

    【讨论】:

    • $reader = $command.ExecuteReader() 本身的进度条怎么样?我还没有测试你的代码,但看起来当代码从一个项目移动到 foreach 中的另一个项目时,进度条会更新,对吧?我想测量查询本身的持续时间。我知道最大数量是 100%。在这种情况下,将是我试图在表中插入的记录数。我的每个查询都是 INSERT ALL 并带有大量记录。我想在 INSERT ACTION 发生时给出一个进度条,但我担心它会卡在阅读器执行中
    • Write-Progress 只会显示脚本在 foreach 中的执行进度。我不确定如何衡量来自 Oracle 客户端的实际查询的进度。您可能可以编写一些内容来显示每个 INSERT 操作并为此编写进度,但这将是一个非常长且复杂的脚本。希望对 Oracle 连接有更深入了解的人可以回答。
    • 感谢彼得...当我逐行执行插入时,我已经完成了这项工作。我的意思是,查询作为单个插入行。但这成了一个问题,因为我的查询有 80.000 多个插入,并且运行时间很长。然后我更改为 INSERT ALL ,它可以轻松处理插入量,性能更好。但是我正在为无法跟踪进度而付出代价,因为该操作被封装在 $reader = $command.ExecuteReader() 中。我可以使用 Measure-Command 但这会给我花在执行上的时间而不是进度本身......
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多