例如,我想像在 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")
应该表现得像你期望的那样。