3

Я хочу использовать объект SQLConnection, как, например, из vb. Я хотел бы сделать это:

например

$conn = New-Object system.data.sqlclient.sqlconnectionstringbuilder
$conn.DataSource = 'myserver'

но это не удается

Keyword not supported: 'DataSource'.
At line:1 char:4
+ $conn. <<<< DataSource = 'myserver'
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

даже если:

PS C:\WINDOWS\system32\WindowsPowerShell> $conn|Get-Member *sour*


   TypeName: System.Data.SqlClient.SqlConnectionStringBuilder

Name       MemberType Definition
----       ---------- ----------
DataSource Property   System.String DataSource {get;set;}

Моя версия Powershell:

PS C:\WINDOWS\system32\WindowsPowerShell> $PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.3634
BuildVersion                   6.0.6002.18111
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

Что вызывает сообщение об ошибке?

В частности, это работает:

$conn.database = 'mydb' 

(и устанавливает свойство InitialCatalog)

и это не удается

$conn.initialcatalog = 'mydb' 

даже если:

PS C:\WINDOWS\system32\WindowsPowerShell> $conn|Get-Member initialcatalog 


TypeName: System.Data.SqlClient.SqlConnectionStringBuilder 

Name MemberType Definition 
---- ---------- ---------- 
InitialCatalog Property System.String InitialCatalog {get;set;} 

Что меня смущает, так это то, что я могу установить свойство "database", даже если его нет в списке участников, но я не могу установить свойства в списке участников, даже если PS говорит, что они доступны для установки.

3 ответа3

2

"Ключевое слово" - это "Источник данных", поэтому вы должны установить $ConnString."Data Source" = 'myserver'

Изменить: Добавление объяснения

Шаг 1: SqlConnectionStringBuilder является производным от DbConnectionStringBuilder, который реализует интерфейсы IDictionary, ICollection, IEnumerable и ICustomTypeDescriptor.

Шаг 2: SqlConnectionStringBuilder:: InitialCatalog внутренне просто устанавливает SqlConnectionStringBuilder:: Item ['Initial Catalog'].

Шаг 3: Когда мы объединяем предыдущие утверждения, мы получаем следующий результат:

PS> $sc = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
PS> $sc.InitialCatalog.Equals($sc.Item('Initial Catalog'))
True

PS> $sc.InitialCatalog.Equals($sc.Item('Database'))
True

# And just for completeness
PS> $sc.InitialCatalog.Equals($sc.Item('Server'))
False

Итак, когда вы выполните это:

$Conn.InitialCatalog = "mydb'

Это переводится на:

$Conn.Item['Initial Catalog'] = "mydb"

Чтобы увидеть доступные свойства для использования таким образом, выполните следующую команду:

$Conn.Keys
0

До сих пор нет причины, по которой это не удается, но другой способ заставить это работать - это вызывать установщики напрямую, а не пытаться установить значение свойств:

$conn.set_InitialCatalog("mydb")

должен вести себя так, как вы ожидаете.

0

Обратите внимание, что .psbase и -Property предоставляют вам доступ к свойствам строки подключения по имени, как в

$conn = New-Object system.data.sqlclient.sqlconnectionstringbuilder
$conn.psbase.DataSource= 'yourDataSource'

или же

$conn = New-Object system.data.sqlclient.sqlconnectionstringbuilder -Property @{DataSource='ursrc'}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .