Получение данных из SQL Server 2008 с помощью Powershell - PullRequest
2 голосов
/ 04 января 2012

У меня возникают трудности с получением данных из простой хранимой процедуры в SQL Server. У меня есть скрипт Powershell, который должен получить переменные, заполненные из 3 столбцов (процедура просто возвращает 1 строку)

Вот что у меня не работает. Почему-то я не ссылаюсь на значение столбца правильно. Я пробовал различные методы, но обычно получаю ошибку «Невозможно индексировать в нулевой массив». Я не хочу перебирать набор результатов, я просто хочу установить некоторые значения из одной строки, возвращаемой в переменные

$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.ConnectionString = `
  "Server=ServerName;Database=ShopDB;Integrated Security=True"
$sqlQuery = new-object System.Collections.Specialized.StringCollection
$sqlQuery.Add("JobSettingsGet")
$Resultset = $conn.ExecuteWithResults($sqlQuery)

# $UserName = $table.Rows(0).Columns(0) 
  # error - Method invocation failed because [System.Data.DataTable] doesn't 
  # contain a method named 'Rows'.
# $UserName = $table.Rows[0].Columns[0] 
  # error - cannot index null array
# $UserName = $table.Row(0).Column(0) 
  # error - Cannot index into a null array,  also Method invocation failed 
  # because [System.Data.DataTable] doesn't contain a method named 'Row'.
# $UserName = $table.Rows[0].Columns[1].Value 
  # error - cannot index null array

Я бы тоже хотел использовать имя столбца, если это возможно.

Есть указатели?

спасибо, Sylvia

1 Ответ

6 голосов
/ 04 января 2012

Вы можете использовать System.Data.SqlClient.SqlConnection вместо SqlServer.Management class

$conn = New-Object Data.Sqlclient.Sqlconnection`
    ("Data Source=DATABASE;Initial Catalog=master;Integrated Security=SSPI;")
$adapter = New-Object Data.Sqlclient.Sqldataadapter("exec sp_who2", $conn)
$set = new-object data.dataset
$adapter.fill($set)
$table = new-object data.datatable
$table = $set.tables[0]

Чтобы распечатать всю таблицу, просто используйте format-table

$table | ft -AutoSize

Чтобы получить столбецпо имени используйте итератор foreach и получите доступ к свойствам заметки по имени

$table | % {$_.login}

. Ed: Здесь тот же запрос с использованием SqlServer.Management.

[void][Reflection.Assembly]::LoadWithPartialName`
   ("Microsoft.SqlServer.ConnectionInfo")
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection
$conn.ConnectionString = `
   "Server=ServerName;Database=ShopDB;Integrated Security=True"
$sqlQuery = new-object System.Collections.Specialized.StringCollection 
$sqlQuery.Add("exec sp_who2") 
$resultset = $conn.ExecuteWithResults($sqlQuery)

Доступ к результатам путем выборанулевой набор результатов, нулевая таблица, нулевая строка и элемент по имени

$resultset[0].tables.Item(0).Rows[0].Item("Login")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...