2012-01-04 68 views
2

我在从SQL Server中的简单存储过程中获取数据时遇到了一些困难。我有一个Powershell脚本,需要从3列填充变量(该过程只返回1行)使用Powershell从SQL Server 2008获取数据

这是我没有工作。不知何故,我没有正确引用列值。我尝试了各种方法,但通常会出现错误“无法索引到空数组”。我不想通过ResultSet迭代,我只是想直接设置一些值从一行返回到变量

$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

你可以使用System.Data.SqlClient.SqlConnection代替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] 

为了打印整个表,只需使用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") 
+0

感谢您的信息。我可以连接到数据库,并使用foreach迭代器工作。但是,我想要做的是(因为我知道只有1行和3列)将实际数据转化为变量而不进行迭代。像下面的东西(它给出错误“无法索引到一个空数组”): $ UserName = $ table.rows [0] .columns [0] – Sylvia 2012-01-05 09:35:53

+0

$ table.rows [0]应该是System.Data。没有Columns成员的DataRow。尝试使用item()方法:$ table.Rows [0] .item(“Login”)。 – vonPryz 2012-01-05 10:13:52

+0

谢谢,它现在有效。任何有关何时最好使用sqldataadapter而不是其他数据访问方法(ExecuteWithResults等)的评论 – Sylvia 2012-01-05 13:06:34