【问题标题】:Using PowerShell to send data from SQL Server to service via SOAP使用 PowerShell 通过 SOAP 将数据从 SQL Server 发送到服务
【发布时间】:2016-02-25 09:14:08
【问题描述】:

我对 PowerShell 还很陌生,对 Web 服务和 SOAP 还是全新的(就像今天一样)。供应商向我们提供了有关其允许创建用户帐户的 Web 服务 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();

【问题讨论】:

  • API 是否允许您在一次调用中发送多个请求?如果是这样,我建议这样做而不是单独进行。
  • 我没想过要问他们,但我会的。谢谢!
  • 我询问了供应商,不幸的是他们每次通话只允许一个请求。

标签: web-services powershell soap


【解决方案1】:

您可以改进的几件事:

  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;
    }
}

【讨论】:

  • 感谢您的反馈。 1. 为了简洁起见,我使用了select *。我只拉我需要的列。 2. 是的,我们正在存储明文密码。但就我们的目的而言,这确实不是问题。 3. 谢谢你。我完全忘记了我可以填充数据集并使用ForEach-Object(相当新,而且全部:-)。
  • 以明文形式存储密码总是是个问题。
  • 下次再​​讨论。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2020-03-09
  • 2016-02-22
  • 2015-12-12
相关资源
最近更新 更多