Використання об'єкта SQLConnection в shellhell


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;} 

Що мене бентежить, це те, чому я можу встановити властивість "база даних", навіть якщо вона не знаходиться в списку членів, але я не можу встановити властивості в списку членів, хоча PS каже, що вони можуть бути налаштовані.


Що з просто використанням $ conn = New-Object System.Data.SqlClient.SqlConnection і надати йому рядок з'єднання?
EBGreen

Я вважаю за краще влаштувати його на власність. Але на самом деле я , що я хочу знати, чому він не працює, встановлюючи відкриті властивості , але робить роботу, встановлюючи приховані властивості.
gerald britton

Відповіді:


2

"Ключове слово" - це "Джерело даних", тому вам доведеться встановити $ConnString."Data Source" = 'myserver'

Редагувати: додавання пояснення

Крок 1: SqlConnectionStringBuilder походить від DbConnectionStringBuilder, який реалізує інтерфейси IDictionary, ICollection, IEnumerable та ICustomTypeDescriptor.

Крок 2: SqlConnectionStringBuilder :: InitialCatalog внутрішньо просто встановлює SqlConnectionStringBuilder :: Item ['Початковий каталог'].

Крок 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

Не впевнений, чому це було проголосовано. Це точно пояснює проблему, причину та вирішення. У мене така ж проблема, і вирішення проблеми працює на мене. Якщо ви вважаєте, що це корисна відповідь, будь ласка, додайте щось корисне або хоча б пояснення.
charleswj81

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'}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.