2014-12-18 3 views
0

Я пытаюсь автор сценария PowerShell, который просто выполняет хранимую процедуру из моей базы данных администрирования, но я бег в это:Позиционный параметр не может быть найден, который принимает аргумент System.Data.SqlClient.SqlDataReader

New-Object : A positional parameter cannot be found that accepts argument 'System.Data.SqlClient.SqlDataReader'. 
At C:\Scripts\Deployment\SPROCTest.ps1:19 char:15 
+  $reader = New-Object -TypeName System.Data.SqlClient.SqlDataReader = $GetEn ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidArgument: (:) [New-Object], ParameterBindingException 
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewObjectCommand 

кодекс, казалось бы, довольно прямо вперед, как это:

$connection = New-Object -TypeName System.Data.SqlClient.SqlConnection 
$connection.ConnectionString = "Server=bhbrf95xva.database.windows.net;Database=MY.DATABASE;Integrated Security=False;User=theuser;Password=xxx^xxx" 
$connection.Open() 

$GetEnvironment = New-Object System.Data.SqlClient.SqlCommand 
$GetEnvironment.CommandText = "Select_Environment_ByEnvironmentName" 
$GetEnvironment.CommandType = [System.Data.CommandType]::StoredProcedure 
$GetEnvironment.Connection = $connection 

$ParamGetEnvironment = New-Object -TypeName System.Data.SqlClient.SqlParameter 
$ParamGetEnvironment.ParameterName = "@EnvironmentName" 
$ParamGetEnvironment.SqlDbType = [System.Data.SqlDbType]::VarChar 
$ParamGetEnvironment.Direction = [System.Data.ParameterDirection]::Input 
$ParamGetEnvironment.Value = 'TheValue' 

$GetEnvironment.Parameters.Add($ParamGetEnvironment) 


$reader = New-Object -TypeName System.Data.SqlClient.SqlDataReader = $GetEnvironment.ExecuteReader() 

$connection.Close() 

Я не слишком обеспокоен (пока) с фактическим форматом этого сценария, я просто пытаюсь заставить его работать первым, но я Интересно, почему и как я узнаю это? System.Data.SqlClient.SqlDataReader?

Нужно ли добавить плагин?

+1

Я не могу попробовать это сейчас, но SqlDataReader не является вам неинтересным. Вы просто получаете возвращаемое значение из SqlCommand.ExecuteReader. Вы попробовали _ $ reader = $ GetEnvironment.ExecuteReader() _ – Steve

+1

@Steve Опубликовать, что в качестве ответа я считаю, что это правильно. Вероятно, OP думает, что им нужно объявить тип, но они этого не делают. – JasonMArcher

+0

@JasonMArcher да, действительно, в SqlDataReader нет конструктора, поэтому код не может быть прав, спасибо – Steve

ответ

1

SqlDataReader не может быть проиндексирован вами. Infact, если вы посмотрите на documentation of SqlDataReader, вы обнаружите, что для него нет публичного конструктора.

Вы получаете SqlDataReader только как возвращаемое значение из вызова SqlCommand.ExecuteReader. Вам просто нужно написать

$reader = $GetEnvironment.ExecuteReader() 

Кроме того, имейте в виду, что, закрывая соединение, используемое в SqlDataReader эффективно калечит способность читателя считывать данные из базы данных. Итак, если вы планируете сделать что-то полезное для читателя, не закрывайте соединение, пока не закончите читать данные.

Смежные вопросы