例如,我想像从 vb 一样使用 SQLConnection 对象。我想这样做:
例如
$conn = New-Object system.data.sqlclient.sqlconnectionstringbuilder
$conn.DataSource = 'myserver'
Run Code Online (Sandbox Code Playgroud)
但这失败了:
Keyword not supported: 'DataSource'.
At line:1 char:4
+ $conn. <<<< DataSource = 'myserver'
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
Run Code Online (Sandbox Code Playgroud)
虽然:
PS C:\WINDOWS\system32\WindowsPowerShell> $conn|Get-Member *sour*
TypeName: System.Data.SqlClient.SqlConnectionStringBuilder
Name MemberType Definition
---- ---------- ----------
DataSource Property System.String DataSource {get;set;}
Run Code Online (Sandbox Code Playgroud)
我的 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
Run Code Online (Sandbox Code Playgroud)
是什么导致了错误消息?
具体来说,这有效:
$conn.database = 'mydb'
Run Code Online (Sandbox Code Playgroud)
(并设置属性“InitialCatalog”)
这失败了
$conn.initialcatalog = 'mydb'
Run Code Online (Sandbox Code Playgroud)
虽然:
PS C:\WINDOWS\system32\WindowsPowerShell> $conn|Get-Member initialcatalog
TypeName: System.Data.SqlClient.SqlConnectionStringBuilder
Name MemberType Definition
---- ---------- ----------
InitialCatalog Property System.String InitialCatalog {get;set;}
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是,为什么我可以设置“数据库”属性,即使它不在成员列表中,但我不能在成员列表中设置属性,即使 PS 说它们是可设置的。
“关键字”是“数据源”,因此您必须设置$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
Run Code Online (Sandbox Code Playgroud)
因此,当您执行此操作时:
$Conn.InitialCatalog = "mydb'
Run Code Online (Sandbox Code Playgroud)
它被翻译为:
$Conn.Item['Initial Catalog'] = "mydb"
Run Code Online (Sandbox Code Playgroud)
要查看以此方式使用的可用属性,请运行以下命令:
$Conn.Keys
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2256 次 |
最近记录: |