在 powershell 中使用 SQLConnection 对象

在 powershell 中使用 SQLConnection 对象

例如,我想像在 vb 中一样使用 SQLConnection 对象。我想这样做:

例如

$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 说它们是可设置的。

答案1

“关键字”是“数据源”,因此您必须设置$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

答案2

请注意,.psbase 和 -Property 都允许您按名称访问连接字符串属性,例如

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

或者

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

答案3

还没有原因为什么会失败,但让它工作的另一种方法是直接调用设置器,而不是尝试设置属性的值:

$conn.set_InitialCatalog("mydb")

应该表现得像你期望的那样。

相关内容