首页 > 解决方案 > 使用 SQL 结果填充组合框并忽略额外的输出

问题描述

我有一个使用 PowerShell 制作的应用程序,它从 SQL 数据库中获取各种控件的信息。我的“视图”偶尔会完美运行。但是如果我关闭应用程序并重新打开,同样的事情会产生不同的结果。我已将 PS 设置为以管理员身份运行,但同样的问题。该视图应读取 1971 年的结果,看起来像

#ASP.Net Client Ugrade
C# Client Upgrade
Another Basic Project Name

然而,虽然这在某些时候可以正常工作......当它决定不正确加载时我得到的输出是

#ASP.Net Client Ugrade
1971
void Open(), void IDbConne

我不确定它为什么要添加属性信息而不是请求的值。也不确定为什么结果有时是正确的,有时是错误的,同时执行相同的行为(刚启动程序,加载时填充该框)。我如何选择和填充数据的相关代码:

[string[]]$projectsAll = ""  #I only do it this way because the sql query is actually in a method, were I return the array-and then do the foreach item in the array add to the projectview  
$query = "select Title from OversightProjectsFix where ID > 0 Order By Title"
    if ($sqlcon.State -eq 'Closed'){$sqlcon.Open()}
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = $query
    $SqlCmd.Connection = $sqlcon
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $ds = New-Object System.Data.DataSet
    $SqlAdapter.Fill($ds)|out-null
    foreach ($Row in $ds.Tables[0].Rows)
    { 
        $projectsAll += "$($Row.Title)"
    }
$ProjectView.Items.Clear()
foreach ($p in $projectsAll)
{
$ProjectView.Items.Add($p)
}

正如我之前提到的,如果运行相同的代码,你应该总是得到相同的结果——但是这个返回不同,我不知道为什么?我怎样才能让它始终工作?

标签: sql-serverwinformspowershellview

解决方案


很难准确理解这段代码有什么问题,但我认为这可能是因为 DataSet 是空的,而你是 . 即我认为它没有连接和提取任何数据。

由于数据集是用 初始化的New-Object,如果它没有正确填充,如果你尝试使用引号迭代它,而不是将其添加为直接赋值,它可能会导致它意外返回数据类型而不是“预期” null 或空字符串。当您尝试这样的事情时,您会看到这一点:

$ds = New-Object System.Data.DataSet

#Returns Null
PS> $ds.Tables[0].Rows
PS> 

#Returns data type
PS> "$ds.Tables[0].Rows"
System.Data.DataSet.Tables[0].Rows

因此,您可能必须删除引号,即:

$projectsAll += $Row.Title

在尝试迭代和添加任何内容之前,您应该添加一个检查以查看数据集是否有内容。

另外,通常通过实现$SqlAdapter.Fill($ds)方法打开连接,而不需要显式打开 SQL 连接。我想知道您的不一致是否是由于 SQL 连接意外打开/关闭?


推荐阅读