Как вызвать метод .net с выходным параметром? - PullRequest
9 голосов
/ 11 марта 2011

Я просто хочу вызвать GenerateScript метод Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator из PowerShell.

#C

public void GenerateScript(
    IScriptFragment scriptFragment,
    out string script
)

Я нашел это , но я не заставляю его работать

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

3 голосов
/ 11 марта 2011

Я полагаю, что ваша проблема связана с вашим первым параметром, который должен быть IScriptFragment.Вы передаете строку.

Вам необходимо передать что-то, полученное из TSqlFragment .Используя что-то вроде TSql100Parser.ParseStatementList , вы получите список фрагментов.

РЕДАКТИРОВАТЬ: Этот пост в блоге имеет проблему, аналогичную вашей второй ошибке.

1 голос
/ 11 марта 2011

Не совсем уверен, как это работает с Powershell, но в обычном C # вам нужно вызывать параметр out с ключевым словом "out" вместо имеющегося у вас "ref". Извините, если это не так, но подумал, что это может помочь.

...