簡體   English   中英

從函數調用函數時從 PowerShell 連接到 SQL Server 數據庫

[英]Connect to SQL Server Database from PowerShell when calling function from function

我正在使用 PowerShell 腳本。 我有一些前輩

  1. 從 .txt 文件中過濾$server$instance名稱。
  2. 在 2 函數中使用$server$instance連接到 SQL Server

我的 .txt 文件代碼如下

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

# Get our list of target servers from the local servers.txt file(Need
$servers = Get-Content 'mirroringserver.txt'

foreach ($prcs in $servers) {
    # The first entry in the file is the machine name, the second is the instance name so separate them
    #$srvc = $prcs.Split($prcs, "\r\n")
    # $ServerName = $prcs
    $srvc = $prcs.Split('\')

    $servers  = $srvc[0]
    $instance = $srvc[1]
    GetConnectionString $servers $instance
    # Ping the machine to see if it's on the network
    $results = gwmi -query "select StatusCode from Win32_PingStatus where Address = '$servers'"

    $responds = $false
    foreach ($result in $results) {
        # If the machine responds break out of the result loop and indicate success
        if ($result.StatusCode -eq 0) {
            $responds = $true
            break
        }
    }

    if ($responds) {
        # Check to see if a directory exists for this machine, if not create one
        if (!(Test-Path -Path .\$servers)) {
            New-Item .\$servers\ -Type Directory
        }

        # Get the server info in the first function and the instance info in the second

        #mirroring $servers $instance
        getInsertServerStatus $servers $instance
    } else {
        # Let the user know we couldn't connect to the server
        Write-Output "$servers does not respond"
    }
}

function GetConnectionString([string]$svr, [string]$inst) {
    return "Server=$svr\$inst;Database=master;Integrated Security=True;"
}

這是我的功能 1:

function mirroring(
    $svr,
    $inst,
    [string] $datastore,
    [string] $datastore1,
    [string] $datastore2,
    [string] $datastore3,
    [string] $datastore4,
    [string] $datastore5,
    [string] $datastore6,
    [string] $datastore7
) {
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = GetConnectionString
    $SqlConnection.Open()
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = " SELECT  db_name(sd.[database_id])AS [Database Name]
            ,sd.mirroring_state                  AS [Mirror State Number]
            ,sd.mirroring_state_desc             AS [Mirror State]
            ,sd.mirroring_partner_name           AS [Partner Name]
            ,sd.mirroring_role_desc              AS [Mirror Role]
            ,sd.mirroring_safety_level_desc      AS [Safety Level]
            ,sd.mirroring_witness_name           AS [Witness]
            ,sd.mirroring_connection_timeout AS [Timeout(sec)]
        FROM sys.database_mirroring AS sd
        WHERE mirroring_guid IS NOT null
        ORDER BY [Database Name];"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    $DataSet.Tables[0]
    $SqlConnection.Close()
    $datastore = $DataSet.Tables[0].Rows[0][0]
    $datastore1 = $DataSet.Tables[0].Rows[0][1]
    $datastore2 = $DataSet.Tables[0].Rows[0][2]
    $datastore3 = $DataSet.Tables[0].Rows[0][3]
    $datastore4 = $DataSet.Tables[0].Rows[0][4]
    $datastore5 = $DataSet.Tables[0].Rows[0][5]
    $datastore6 = $DataSet.Tables[0].Rows[0][6]
    $datastore7 = $DataSet.Tables[0].Rows[0][7]
    $script:ServerStatus1 = "DataBase Name:"+ $datastore+",Mirror State Number"+$datastore1+",Mirror State"+$datastore2+",Partner Name"+$datastore3+",Mirror Role"+$datastore4+",Safety Level"+$datastore5+",Witness"+$datastore6+",Timeout(In Sec)"+$datastore7
    return $script:ServerStatus1
}

這是我的功能 2:

function getInsertServerStatus(
    $svr1,
    $inst2,
    $ServerName = $svr1+"\"+$inst2,
    $RemActonToBeTaken = 0,
    $ServerStatus
) {
    mirroring
    $Script:ServerStatus1
    $Script:ServerStatus= $ServerStatus1

    Write-Host "ServerName=$ServerName"
    Write-Host "InstanceName=$inst2"
    Write-Host "ServerStatus=$ServerStatus1"
    Write-Host "RemActonToBeTaken=$RemActonToBeTaken"

    $SqlConnection1 = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection1.ConnectionString = "Server=$svr1\$inst2;Database=master;Integrated Security=True;"
    $SqlConnection1.Open()
    $SqlCmd1 = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd1.CommandText = "USP_RemedialActionDetails"
    $SqlCmd1.Connection = $SqlConnection1
    $SqlCmd1.CommandType = [System.Data.CommandType]::StoredProcedure

    $InParameter1 = New-Object System.Data.SqlClient.SqlParameter;
    $InParameter1 = $SqlCmd1.Parameters.Add("@ServerName" , [System.Data.SqlDbType]::String)
    $InParameter1.Value = $ServerName
    $InParameter1.Direction = [System.Data.ParameterDirection]"Input";

    $InParameter2 = New-Object System.Data.SqlClient.SqlParameter;
    $InParameter2=$SqlCmd1.Parameters.Add("@InstanceName" , [System.Data.SqlDbType]::String)
    $InParameter2.Value = $inst2
    $InParameter2.Direction = [System.Data.ParameterDirection]"Input";

    $InParameter3 = New-Object System.Data.SqlClient.SqlParameter;
    $InParameter3=$SqlCmd1.Parameters.Add("@ServerStatus" , [System.Data.SqlDbType]::String)
    $InParameter3.Value = $ServerStatus1
    $InParameter3.Direction = [System.Data.ParameterDirection]"Input";

    $InParameter4 = New-Object System.Data.SqlClient.SqlParameter;
    $InParameter4=$SqlCmd1.Parameters.Add("@RemActionToBeTaken" , [System.Data.SqlDbType]::String)
    $InParameter4.Value = $RemActonToBeTaken
    $InParameter4.Direction = [System.Data.ParameterDirection]"Input";

    $result = $SqlCmd1.ExecuteNonQuery()
    Write "result=$result"
    $SqlConnection1.Close()
    $SQLCmd1.Dispose() | Out-Null
}

我正在調用函數內部mirroring到函數getInsertServerStatus 連接字符串進入函數( mirroring )連接錯誤,因為找不到$server$instance名稱。

您的代碼中有一些錯誤:

首先,在函數getInsertServerStatusyou 中調用鏡像而不傳遞參數 $svr $inst .... 它應該是:

   mirroring  $svr1  $inst1  ... other parameters

second, Inside the function **mirroring** you call **GetConnectionString** 

不傳遞參數 $servers $instance 應該是:

    GetConnectionString $svr  $inst

在主程序中,您調用 GetConnectionString $servers $instance 並且您沒有將返回值傳遞給變量並且對您的代碼沒有影響,請刪除此行

使用建議的代碼修改您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM