簡體   English   中英

使用PowerShell通過SOAP將數據從SQL Server發送到服務

[英]Using PowerShell to send data from SQL Server to service via SOAP

我對PowerShell還是相當陌生,並且對Web服務和SOAP還是全新的(就像今天一樣)。 某供應商向我們提供了有關其Web服務API的文檔,該API允許創建用戶帳戶。 我正在嘗試使用PowerShell將我們的用戶從SQL Server中拉出並將數據發送到他們的服務。 我們將需要不斷添加用戶。

下面是我想出的簡化版本,它似乎確實有效。 供應商告訴我在測試時包括一次dry_run參數,而我從response_type得到了一次dry_run_success

我的問題是:這是否幾乎是使用PowerShell的合適方法?

# Open ADO.NET Connection to database
$dbConn = New-Object Data.SqlClient.SqlConnection;
$dbConn.ConnectionString = "Data Source=mydbserver;User ID=someuserid;Password=mypassword;Initial Catalog=mydatabase";
$dbConn.Open();
$sql = "select * from mytable";
$dbSqlCmd = New-Object Data.SqlClient.SqlCommand $sql, $dbConn;
$dbRd = $dbSqlCmd.ExecuteReader();

# Create a Web Service Proxy
$proxy = New-WebServiceProxy -Uri https://somedomain.com/service/wsdl
$namespace = $proxy.GetType().NameSpace
$param = New-Object($namespace + ".somemethod")

# Loop through records from SQL and invoke the web service
While ($dbRd.Read())
{
    $param.user_id = $dbRd.GetString(0)
    $param.password = $dbRd.GetString(1)
    $param.display_name = $dbRd.GetString(2)

    $request = $proxy.TheMethod($param)

    if ($request.response_type -eq 'error')
    {
        $request.error.extended_error_text
    }
}

# Clean up
$dbRd.Close();
$dbSqlCmd.Dispose();
$dbConn.Close();

您可以改善的幾件事:

  1. 不要在SQL查詢中使用select * 請始終按需要的順序指定所需的字段。 如所寫,如果有人要重組表以使用戶ID不是第一列,那么您將一團糟,因為您正在按字段的序號訪問字段
  2. 您顯然將這些密碼以明文形式存儲在數據庫中。 任何有權訪問您數據庫的人都知道您每個用戶的憑據。 這是非常不好的事情。 解決這個問題可能是一個非常大的討論。
  3. 您的代碼使數據庫連接保持打開狀態,直到腳本完成。 考慮到這里的范圍,它可能不會引起重大問題,但是您的數據庫訪問策略應該是盡快進入,獲取數據,退出和斷開連接。
$sql = "select user_id, password, display_name from mytable";
$QueryCmd = $dbConn();
$QueryCmd.CommandText = $sql;
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$QueryCmd.Connection = $dbConn;
$SqlAdapter.SelectCommand = $QueryCmd;
$DataSet = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet)
$dbConn.Close();
$dbConn.Dispose();

$MyResults = $DataSet.Tables[0];
$MyResults | foreach-object {
    $param.user_id = $_.user_id;
    $param.password = $_.password;
    $param.display_name = $_.display_name;

    $request = $proxy.TheMethod($param);

    if ($request.response_type -eq 'error')
    {
        $request.error.extended_error_text;
    }
}

暫無
暫無

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

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