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

时间:2017-01-24 13:26:43

标签: 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:使用“1”参数调用“.ctor”的异常:“关键字   不支持:'元数据'。“在行:1个字符:17   + $ ConstringObj = New-Object System.Data.SqlClient.SqlConnectionStringBuilder($ con ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(:) [New-Object],MethodInvocationException       + FullyQualifiedErrorId:ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

如何在PowerShell中执行此操作?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

问题

在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构建在实现DbConnectionStringBuilderIDictionary之上,因此从根本上讲,我们正在使用带有一些语法糖包装器的字典对象

.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参数

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

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

其他阅读

Using SQLConnection object in PowerShell