繁体   English   中英

如何使用 PowerShell 从 Connectionstring 获取数据源?

[英]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 连接关键字不存在。

解决方案

选项 1 - 使用字典名称

您可以使用括号或点符号和实际的 sql 键来访问哈希表中的条目

$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder["Data Source"] = "server_name"
$cnnBuilder."Initial Catalog" = "db_name"

选项 2 - 使用PSBase

PSBase返回“对象的原始视图” ,并将为我们提供 dotnet 中的默认行为

$cnnBuilder  = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder.PSBase.DataSource = "server_name"
$cnnBuilder.PSBase.InitialCatalog = "db_name"

选项 3 - 使用-Property参数

在构建过程中,您可以在New-Object上设置-Property参数,该参数“设置属性值并调用新对象的方法”。

$cnnBuilder  = New-Object System.Data.SqlClient.SqlConnectionStringBuilder `
    -Property @{
        DataSource = "server_name"
        InitialCatalog = "db_name"
    }

补充阅读

在 PowerShell 中使用 SQLConnection 对象

你的例子应该有效。 但是,您也可以使用正则表达式获取数据源:

[regex]::Match($ConstringObj, 'Data Source=([^;]+)').Groups[1].Value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM