2012-01-04 8 views
2

SQL Serverの単純なストアドプロシージャからデータを取得するのが困難です。私は変数を3つの列から入力する必要があるPowershellスクリプトを持っています(このプロシージャは1行を返します)Powershellを使用してSQL Server 2008からデータを取得する

これは私が動作していないものです。何とか私は列の値を正しく参照していません。私はさまざまな方法を試みましたが、通常、 "null配列にインデックスできません"というエラーが表示されます。私は結果セットを反復処理する必要はありません、私は直接、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 

に戻りました。

任意のポインタ?

おかげで、 シルビア

答えて

5

あなただけで列を取得するにはformat-table

$table | ft -AutoSize 

を使用し、テーブル全体を印刷するために代わりSqlServer.Managementクラス

$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] 

System.Data.SqlClient.SqlConnectionを使用することができます名前、foreachイテレータを使用して名前でアクセスします。

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") 
+0

おかげでゼロ次のResultSet、ゼロ次表、ゼロ次の行アイテムをピッキングすることによって得られます。私は、データベースに接続し、foreachイテレータを使用して動作することができます。しかし、私がしたいことは、(私は3列の行が1つしかないことを知っているので)実際のデータを反復せずに変数に取り込むことです。以下のような何か(エラーを与える "ができるNULLを配列にないインデックス"): $ユーザー名= $ table.rows [0] .columns [0] [0]はSystem.Dataあるべき – Sylvia

+0

$ table.rows。 Columnsメンバーを持たないDataRow。 item()メソッドを使ってみてください:$ table.Rows [0] .item( "Login")。 – vonPryz

+0

ありがとうございます、今すぐ動作します。他のデータアクセスメソッド(ExecuteWithResultsなど)の代わりにsqldataadapterを使用するのが最善の場合のコメント – Sylvia

関連する問題