[英]How to get datasource from Connectionstring using PowerShell?
在 .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)
新对象:使用“1”参数调用“.ctor”的异常:“不支持关键字:‘元数据’。” 在 line:1 char:17 + $ConstringObj = New-Object System.Data.SqlClient.SqlConnectionStringBuilder($con ... + ~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [新对象], MethodInvocationException +fullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
如何在 PowerShell 中做到这一点?
在 PowerShell 中使用SqlConnectionStringBuilder
时有一些奇怪的行为 - 让我解释一下
由于它是一个 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 通过覆盖字典访问器和 setter 来解决这个问题(此处简化):
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 连接关键字不存在。
您可以使用括号或点符号和实际的 sql 键来访问哈希表中的条目
$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder["Data Source"] = "server_name"
$cnnBuilder."Initial Catalog" = "db_name"
PSBase
PSBase
返回“对象的原始视图” ,并将为我们提供 dotnet 中的默认行为
$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder.PSBase.DataSource = "server_name"
$cnnBuilder.PSBase.InitialCatalog = "db_name"
-Property
参数在构建过程中,您可以在New-Object
上设置-Property
参数,该参数“设置属性值并调用新对象的方法”。
$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder `
-Property @{
DataSource = "server_name"
InitialCatalog = "db_name"
}
你的例子应该有效。 但是,您也可以使用正则表达式获取数据源:
[regex]::Match($ConstringObj, 'Data Source=([^;]+)').Groups[1].Value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.