6 votes

Utilisation de l'objet SQLConnection en PowerShell

Je veux utiliser l'objet SQLConnection comme je le ferais en vb, par exemple. J'aimerais faire ceci:

par exemple.

$conn = Nouvel objet system.data.sqlclient.sqlconnectionstringbuilder
$conn.DataSource = 'monserveur'

mais cela échoue:

Mot-clé non pris en charge: 'DataSource'.
À la ligne:1 caractère:4
+ $conn. <<<< DataSource = 'monserveur'
    + CategoryInfo          : Operation non valide : [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

même si:

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

   TypeName: System.Data.SqlClient.SqlConnectionStringBuilder

Name       MemberType Definition
----       ---------- ----------
DataSource Propriété   System.String DataSource {get;set;}

Ma version de 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

Qu'est-ce qui cause le message d'erreur?

En particulier, ceci fonctionne:

$conn.database = 'mabase' 

(et définit la propriété 'InitialCatalog')

et cela échoue

$conn.initialcatalog = 'mabase' 

même si:

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

TypeName: System.Data.SqlClient.SqlConnectionStringBuilder 

Name MemberType Definition 
---- ---------- ---------- 
InitialCatalog Propriété System.String InitialCatalog {get;set;} 

Ce qui me perturbe, c'est pourquoi je peux définir la propriété "database" même si elle n'est pas dans la liste des membres, mais je ne peux pas définir les propriétés de la liste des membres, même si PS dit qu'elles sont configurables.

3voto

Eris Points 523

Le "Mot-clé" est "Source de données" donc vous devez définir $ConnString."Source de données" = 'monserveur'

Modifier: Ajout d'explication

Étape 1: SqlConnectionStringBuilder dérive de DbConnectionStringBuilder qui implémente les interfaces IDictionary, ICollection, IEnumerable et ICustomTypeDescriptor.

Étape 2: SqlConnectionStringBuilder::InitialCatalog fixe simplement SqlConnectionStringBuilder::Item['Catalogue initial'] en interne.

Étape 3: Lorsque nous combinons les déclarations précédentes, nous obtenons le résultat suivant:

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

PS> $sc.InitialCatalog.Equals($sc.Item('Base de données'))
True

# Et juste pour être complet
PS> $sc.InitialCatalog.Equals($sc.Item('Serveur'))
False

Donc, lorsque vous exécutez ceci:

$Conn.InitialCatalog = "mabdd'

Cela se traduit par:

$Conn.Item['Catalogue initial'] = "mabdd"

Pour voir les propriétés disponibles à utiliser de cette manière, exécutez cette commande:

$Conn.Keys

1voto

unbob Points 111

Notez que à la fois .psbase et -Property vous donnent accès aux propriétés de la chaîne de connexion par leur nom, comme dans

$conn = New-Object system.data.sqlclient.sqlconnectionstringbuilder
$conn.psbase.DataSource= 'votreSourceDeDonnées'

ou

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

0voto

Sean Kleinjung Points 947

Je n'ai toujours pas de raison pourquoi cela échoue, mais une autre façon de faire fonctionner cela est d'appeler directement les setters plutôt que d'essayer de définir la valeur des propriétés :

$conn.set_InitialCatalog("mydb")

devrait se comporter comme vous vous y attendez.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X