在 .Net 中,我们可以使用以下机制从连接字符串中获取数据源:
System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder(connectionString);
string server = builder.DataSource;
我试图在 PowerShell 中执行此操作,但出现以下异常:
$ConstringObj = New-Object System.Data.SqlClient.SqlConnectionStringBuilder($conString)
New-Object : Exception calling ".ctor" with "1" argument(s): "Keyword not supported: 'metadata'." At line:1 char:17 + $ConstringObj = New-Object System.Data.SqlClient.SqlConnectionStringBuilder($con ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
如何在 PowerShell 中做到这一点?
最佳答案
问题
使用 SqlConnectionStringBuilder
时有一些奇怪的行为在 PowerShell 中 - 让我解释一下
由于它是一个 dotnet 类,因此您会期望 C# 中可用的所有相同的属性和方法
例如,这在 C# 中工作正常:
var cnnBuilder = new SqlConnectionStringBuilder();
cnnBuilder.DataSource = "server_name";
cnnBuilder.InitialCatalog = "db_name";
所以 PS 中的等效代码应该可以工作:$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder.DataSource = "server_name"
$cnnBuilder.InitialCatalog = "db_name"
然而,SqlConnectionStringBuilder
建立在 DbConnectionStringBuilder
之上实现 IDictionary
所以从根本上说,我们正在使用一个带有一些语法糖包装器的字典对象.NET 用 override on the dictionary accessors and setters 解决了这个问题像这样(这里简化):
public override object this[string keyword] {
get {
Keywords index = GetIndex(keyword);
return GetAt(index);
}
set {
Keywords index = GetIndex(keyword);
switch(index) {
case Keywords.DataSource: DataSource = ConvertToString(value); break;
case Keywords.InitialCatalog: InitialCatalog = ConvertToString(value); break;
// ***
}
}
}
所以真的,它需要DataSource
属性并将其映射到 "Data Source"
键(带空格)每当 PS 分配或检索值时,它必须决定是使用底层字典实现还是使用属性。当您寻找
DataSource
时在字典中(没有空格),那个 sql connection keyword不存在。解决方案
选项 1 - 使用字典名称
您可以使用括号或点符号和实际的 sql 键来访问 hashtable 中的条目。
$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder["Data Source"] = "server_name"
$cnnBuilder."Initial Catalog" = "db_name"
选项 2 - 使用 PSBase
PSBase
返回 "raw view of the object"并将为我们提供 dotnet 中的默认行为$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder.PSBase.DataSource = "server_name"
$cnnBuilder.PSBase.InitialCatalog = "db_name"
选项 3 - 使用 -Property
范围在构建过程中,您可以设置
-Property
New-Object
上的参数它“设置属性值并调用新对象的方法”。$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder `
-Property @{
DataSource = "server_name"
InitialCatalog = "db_name"
}
补充阅读Using SQLConnection object in PowerShell
关于sql - 如何使用 PowerShell 从 Connectionstring 获取数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41829420/