使用PowerShell通过SOAP将数据从SQL Server发送到服务

时间:2016-02-25 00:09:56

标签: web-services powershell soap

我对PowerShell和全新(如今)的Web服务和SOAP都很新。供应商向我们提供了有关其Web服务API的文档,该API允许创建用户帐户。我正在尝试使用PowerShell从SQL Server中提取用户并将数据发送到他们的服务。我们需要不断添加用户。

以下是我提出的一个简化版本,它实际上似乎有效;供应商告诉我在测试时加入dry_run参数,我从dry_run_success获得response_type

我的问题是:这是否恰好是使用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 个答案:

答案 0 :(得分:2)

你可以改进几件事:

  1. 不要在SQL查询中使用select *。始终按您需要的顺序指定所需的字段。如上所述,如果有人要对表格进行重组,使得用户ID不在第一列,那么您手上就会弄得一团糟,因为您按照序号来访问字段
  2. 您显然将这些密码以明文形式存储在数据库中。有权访问您数据库的任何人都知道每个用户的凭据。这是一件非常糟糕的事情。解决这个问题可能是非常重要的讨论。
  3. 您的代码会保持数据库连接处于打开状态,直到脚本完成。鉴于此处的范围,它可能 可能不会导致重大问题,但您的数据库访问策略应该是进入,获取数据,离开&尽可能快地断开连接。
  4. $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;
        }
    }