在.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中执行此操作?
答案 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
构建在实现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不存在。
您可以将括号或点号与实际的sql键一起使用,以访问hashtable
中的条目$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$cnnBuilder["Data Source"] = "server_name"
$cnnBuilder."Initial Catalog" = "db_name"
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"
-Property
参数在构造过程中,可以在New-Object
上设置-Property
参数,该参数“设置属性值并调用新对象的方法。”
$cnnBuilder = New-Object System.Data.SqlClient.SqlConnectionStringBuilder `
-Property @{
DataSource = "server_name"
InitialCatalog = "db_name"
}