在 PowerShell 中如何解决 DataSet.Fill 中的异常?

Posted

技术标签:

【中文标题】在 PowerShell 中如何解决 DataSet.Fill 中的异常?【英文标题】:In PowerShell how to troubleshoot exception in DataSet.Fill? 【发布时间】:2017-08-03 00:13:22 【问题描述】:

我正在使用我在 SO 上找到的函数从 SQL 服务器检索数据并生成 XML。

function Invoke-SQL 
    param(
        [string] $sqlCommand = $(throw "Please specify a query.")
      )

    $connectionString = "Data Source=$server;Initial Catalog=$database;user id=$uid;password=$pwd"

    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
    $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
    $connection.Open()

    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    $adapter.Fill($dataSet) | Out-Null

    $connection.Close()
    $tableOutput = $dataSet.Tables

    foreach($row in $tableOutput) 
        $xml  = $row | ConvertTo-Xml -NoTypeInformation -Depth 1
        $xml.InnerXML
    

它大部分时间都有效,但偶尔,来自同一数据库和表的完全相同的 SELECT(范围除外)会引发以下异常:

Exception calling "Fill" with "1" argument(s): "Incorrect syntax near '>'."
At DBTest.ps1:22 char:18
+     $adapter.Fill <<<< ($dataSet) | Out-Null
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

如何调试哪些行和/或哪些数据使 Fill 方法中断?

【问题讨论】:

失败时的 $sqlCommand 是什么?我会先检查一下,通常这个错误是 SQL 命令的问题。 是的,这是您的$sqlCommand 中的 SQL 错误,例如***.com/q/39874629/478656 或 ***.com/questions/24661805/incorrect-syntax-near 或 ***.com/questions/39300057/incorrect-syntax-near 或 ***.com/questions/40086340/… - 不正确的查询、损坏的转义、使用来自较新 SQL 服务器的功能等。 也许您的查询经常写错。我会尝试在您的 param() 之后立即添加如下行:$sqlCommand&gt;&gt; c:\logs\myquery.log。查看该日志文件中的查询(或 $sqlCommand),看看是否可以捕获它。 您要触发的查询在哪里?您是否直接在 ssms 中运行查询并检查查询是否返回正确的数据。 谢谢大家,实际上是偶尔的查询语法错误。我错误地认为它正在解析返回的数据。我赞成前 3 个 cmets。 【参考方案1】:

根据 cmets,它是 SQL 命令本身。当您生成 SQL 命令时,请确保 每个 变量都经过验证和完整性检查。正如一些 cmets 建议的那样,记录 查询可以帮助进行故障排除。

【讨论】:

以上是关于在 PowerShell 中如何解决 DataSet.Fill 中的异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试混合 cmd 和 powershell 脚本以解决特殊字符问题,如 & 和

如何解决错误:命令失败:powershell (Get-CimInstance -ClassName Win32_OperatingSystem>

如何从PowerShell命令行转义管道字符以传递到非PowerShell命令

如何从 PowerShell 脚本触发 T4 模板

如何在powershell中将变量放入文件名

从任务计划程序运行时如何重定向 PowerShell 输出?