Читать несколько таблиц из набора данных в Powershell - PullRequest
1 голос
/ 12 апреля 2010

Я использую функцию, которая собирает данные с сервера SQL:

function Invoke-SQLCommand {
param(
    [string] $dataSource = "myserver",
 [string] $dbName = "mydatabase",
 [string] $sqlCommand = $(throw "Please specify a query.")
)

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = `
   "Server=$dataSource;Database=$dbName;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $sqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

}

Отлично работает, но возвращает только одну таблицу. Я передаю несколько операторов Select, поэтому набор данных содержит несколько таблиц.

я заменил

$DataSet.Tables[0]

с

for ($i=0;$i -lt $DataSet.tables.count;$i++){
    $Dataset.Tables[$i]
    }

но консоль показывает только содержимое первой таблицы и пустые строки для каждой записи того, что должно быть второй таблицей. Единственный способ увидеть результат - изменить код на

$Dataset.Tables[$i] | out-string

но я не хочу строки, я хочу иметь табличные объекты для работы.

Когда я присваиваю то, что возвращает Invoke-SQLCommand, переменной, я вижу, что у меня есть массив объектов datarow, но только из первой таблицы. Что случилось со вторым столом?

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

Я попробовал вашу функцию (которая возвращает $DataSet.Tables), и она работала довольно хорошо для меня. Эта команда вернула строки из обеих таблиц:

$t = Invoke-sqlcommand '.\sql2005' 'AdventureWorksDW' `
       "SELECT * FROM DimOrganization; SELECT * FROM DimSalesReason"
$t[0]  #returns rows from first table
$t[1]  #returns rows from second table

В любом случае, что я бы порекомендовал:

Сначала я бы отбросил вывод из Fill:

$SqlAdapter.Fill($DataSet) > $null

Он также возвращается, но это, вероятно, нежелательно.

Так как в вашем случае Invoke-SqlCommand не работает, я бы попытался вернуть 1 dim массив следующим образом:

function Invoke-SQLCommand {
   ...
   ,$DataSet.Tables
}

Учтите, что PowerShell обрабатывает DataTable специально, а при попытке отформатировать его распадает коллекцию Rows (кредиты для x0n). Вот почему просто выполнение $t из моего примера отображает все строки, возвращенные командой.

0 голосов
/ 13 апреля 2010

Спасибо за ваш ответ.

Ну, я не могу объяснить, почему это работает для вас, а не для меня.

Если я запускаю точно такую ​​же команду, как вы (за исключением источника данных, mysqlserver \ sqlexpress в моем случае), $ t [0] возвращает только первую строку первой таблицы и $ t [1] вторую строку .

В моем случае, похоже, происходит то, что строки из всех таблиц объединяются, поэтому я получаю один большой набор данных, а не отдельные ожидаемые таблицы.

Я закончил замену:

for ($i=0;$i -lt $DataSet.tables.count;$i++){
    $Dataset.Tables[$i]
    }

только с

$Dataset

Затем я могу ссылаться на отдельные таблицы из моего скрипта, используя $ t.Tables [0] и $ t.Tables [1].

Еще раз спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...