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

标签 sql .net 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)

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 - 使用 PSBasePSBase返回 "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/

相关文章:

sql - Firebird 是否具有运行系统级命令的能力?

sql - Transact SQL union all on json 结果转义嵌套的 json 查询

.net - 为 .net 商店开始移动/IOS 开发的最佳方式

c# - COM+ 调用远程实例中的方法未知名称错误

azure - 如何使用 Get-AzVM 输出订阅名称

powershell - 让PowerShell自动完成cli参数

java - android 和 java 中的 SQLite 数据库

sql - 查询postgresql表的效率问题

c# - UserPrincipal 扩展返回计算机

powershell - 有没有办法使用 PowerShell 在 Azure 中接受 'Terms & Conditions'?