Usando o objeto SQLConnection no powershell

3

Eu quero usar o objeto SQLConnection como eu faria em vb, por exemplo. Eu gostaria de fazer isso:

por exemplo,

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

mas isso falha:

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

embora:

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


   TypeName: System.Data.SqlClient.SqlConnectionStringBuilder

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

Versão do meu 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

O que está causando a mensagem de erro?

Especificamente, isso funciona:

$conn.database = 'mydb' 

(e define a propriedade 'InitialCatalog')

e isso falha

$conn.initialcatalog = 'mydb' 

embora:

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


TypeName: System.Data.SqlClient.SqlConnectionStringBuilder 

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

O que me deixa confuso é por que posso definir a propriedade "database" mesmo que não esteja na lista de membros, mas não posso definir as propriedades na lista de membros, mesmo que o PS diga que elas podem ser configuradas.

    
por gerald britton 25.07.2012 / 21:28

2 respostas

2

A "Palavra-chave" é "Fonte de dados", por isso você precisa definir $ConnString."Data Source" = 'myserver'

Editar: Adicionando explicação

Etapa 1: O SqlConnectionStringBuilder deriva de DbConnectionStringBuilder, que implementa as interfaces IDictionary, ICollection, IEnumerable e ICustomTypeDescriptor.

Etapa 2: SqlConnectionStringBuilder :: InitialCatalog internamente apenas define SqlConnectionStringBuilder :: Item ['Initial Catalog'].

Etapa 3: quando combinamos as declarações anteriores, obtemos o seguinte resultado:

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

Então, quando você executa isso:

$Conn.InitialCatalog = "mydb'

É traduzido para:

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

Para ver as propriedades disponíveis para uso dessa maneira, execute este comando:

$Conn.Keys
    
por 19.07.2013 / 07:42
0

Ainda não tem um motivo porque isso falha, mas uma maneira diferente de fazer isso funcionar é chamar os setters diretamente, em vez de tentar definir o valor das propriedades:

$conn.set_InitialCatalog("mydb")

deve se comportar como você espera.

    
por 05.09.2018 / 12:41

Tags