【问题标题】:Powershell loop, with sqlplus connection stringPowershell 循环,带有 sqlplus 连接字符串
【发布时间】:2021-05-12 21:24:01
【问题描述】:

我想创建一个 power shell 脚本,它使用 sqlplus 循环连接字符串,但我不确定如何在 power shell 中执行此操作。

类似:

begin
  for i in 1..10
  loop
    sqlplus .../...@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=...)(HOST=...)(PORT=...)))(CONNECT_DATA=(SID=...)))
    --- wait for response then move foreward
  end loop;
end

想法是我想测试连接字符串中不同的connection_timeout值以确定哪个值更稳定。

我在网上找到了这段 powershell 代码,但我不确定如何根据我的要求对其进行调整:

$lines = Get-Content 'c:\firstsecondnames.txt'
$DBs = "192.168.1.1"
$DB = "DBA"
$ConnectionTimeout = 90
$QueryTimeout = 90

foreach ($line in $lines) {
    $vala  = $line.Split(',')[0]
    $valb  = $line.Split(',')[1]
    #DB query
    $Query = "select ValC from dbo.PROCESSED_INTERCHANGES where Firstname = '$vala' and middlename = '$valb'"
    $conn=new-object System.Data.SqlClient.SQLConnection
    $ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $DBs,$DB,$ConnectionTimeout
    $conn.ConnectionString=$ConnectionString
    $conn.Open()
    $cmd=new-object system.Data.SqlClient.SqlCommand($Query,$conn)
    $cmd.CommandTimeout=$QueryTimeout
    $ds=New-Object system.Data.DataSet
    $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
    [void]$da.fill($ds)
    $conn.Close()
    $conn.Dispose()
    foreach ($valC in $ds.tables[0].rows.ValC) {
        $fullname = $vala + $valb + $valC
      Write-Host $fullname
    }

} 

【问题讨论】:

    标签: powershell loops scripting sqlplus


    【解决方案1】:

    如果您只想测试各种 connection_timeout 值,则应遍历这些值,而不是遍历一组用户 FirstNames 和 MiddleNames。

    类似这样的:

    $DBs = "192.168.1.1"
    $DB  = "DBA"
    # insert working values here. We don't test these, we only try out different ConnectionTimeouts
    $vala  = 'FirstName'
    $valb  = 'MiddleName'
    $QueryTimeout = 90
    # try a range of connection timeout values. For demo here 10, 20 .. 200 + 0
    $ConnectionTimeout = for ($i = 10; $i -le 200; $i += 10) { $i }
    # lastly, add 'Infinite' value 0
    $ConnectionTimeout += 0
    
    $ConnectionTimeout | ForEach-Object {
        # show what timeout value is now in effect
        Write-Host $(switch ($_){
            0       { "Attempting Infinite timeout $_" ; break}
            30      { "Attempting Default timeout $_"  ; break }
            default { "Attempting timeout $_" }
        }) -ForegroundColor Cyan
        #DB query
        $Query = "select ValC from dbo.PROCESSED_INTERCHANGES where Firstname = '$vala' and middlename = '$valb'"
        $conn = New-Object System.Data.SqlClient.SQLConnection
        $ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $DBs, $DB, $_
        $conn.ConnectionString = $ConnectionString
        $conn.Open()
        $cmd = New-Object system.Data.SqlClient.SqlCommand($Query,$conn)
        $cmd.CommandTimeout = $QueryTimeout
        $ds = New-Object system.Data.DataSet
        $da = New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
        [void]$da.fill($ds)
        foreach ($valC in $ds.tables[0].rows.ValC) {
            $fullname = $vala + $valb + $valC
            Write-Host $fullname
        }
        # clean-up
        $conn.Close()
        $conn.Dispose()
        $ds.Dispose()
        $da.Dispose()
    } 
    

    【讨论】:

    • 谢谢,我会试试这个结构,但是为了检查哪个值是稳定的,基本上我需要将连接字符串循环到无限(手动中断)。我可以手动更改超时值
    • @gavagio 我已经编辑了答案以包含一个新的超时方案,包括无限
    猜你喜欢
    • 2016-12-15
    • 2013-12-22
    • 2017-12-18
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2015-07-27
    • 2013-07-07
    相关资源
    最近更新 更多