如何使用输出参数调用.net方法?

时间:2011-03-11 18:12:07

标签: .net powershell out

我只是想从PowerShell调用Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator GenerateScript 方法。

#C

public void GenerateScript(
    IScriptFragment scriptFragment,
    out string script
)

我找到了this,但我没有让它工作

$sg = new-object  Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator

$sql = 'select * from PowerShell'

$out = ''
$sg.GenerateScript($sql, [ref] $out)

$out

这给出了

Cannot find an overload for "GenerateScript" and the argument count: "2".
At line:6 char:19
+ $sg.GenerateScript <<<< ($sql, [ref] $out)
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

修改

当前版本是

$sql = 'select * from PowerShell'

$sr = new-Object System.IO.StringReader($sql)

$sg =     new-object Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator
$parser = new-object Microsoft.Data.Schema.ScriptDom.Sql.TSQL100parser($true)

$errors = ''
$fragment = $parser.Parse($sr,([ref]$errors))

$out = ''
$sg.GenerateScript($fragment,([ref][string]$out))

$out

但我在行

中收到错误
$fragment = $parser.Parse($sr,([ref]$errors))



Cannot find an overload for "Parse" and the argument count: "2".
At line:11 char:26
+ $fragment = $parser.Parse <<<< ($sr,([ref]$errors))
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

我正在尝试转换

    IList<ParseError> errors;

    using (StringReader sr = new StringReader(inputScript))
    {
        fragment = parser.Parse(sr, out errors);
    }

修改

好的,这有效:

$sql = @'
select * from PowerShell -- a comment
where psRefnr = 1
'@
$options = new-object Microsoft.Data.Schema.ScriptDom.Sql.SqlScriptGeneratorOptions

$sr = new-Object System.IO.StringReader($sql)

$sg =     new-object Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator($options)
$parser = new-object Microsoft.Data.Schema.ScriptDom.Sql.TSQL100parser($true)

$errors = $null
$fragment = $parser.Parse($sr,([ref]$errors))

$out = $null
$sg.GenerateScript($fragment,([ref]$out))

$out

并生成(它会按预期删除评论)

SELECT *
FROM   PowerShell
WHERE  psRefnr = 1;

2 个答案:

答案 0 :(得分:3)

我相信你的问题是你的第一个参数,它应该是一个IScriptFragment。你正在传递一个字符串。

您需要传递源自TSqlFragment的内容。使用类似TSql100Parser.ParseStatementList方法的内容,您将获得一个片段列表。

编辑:此blog post与您的第二个错误有类似的问题。

答案 1 :(得分:2)

不完全确定它如何与Powershell一起使用,但在普通的C#中,您需要使用关键字“out”而不是“ref”来调用out参数。对不起,如果这是基础,但认为它可能有帮助。