我现在在PowerShell中使用Invoke-ASCmd
在SQL Server中创建一个数据库,如下所示:
Invoke-ascmd -Query $MyScript -Server $ASServer
其中$MyScript
是一个字符串,其中包含我之前读过的 .xmla 文件的内容。
这很好用。现在我需要在 C# 中做类似的事情,但找不到像 PowerShell 中那样的简单解决方案。
我看到有些人使用名为 Microsoft.AnalysisServices.XMLA.dll
的Microsoft DLL,但它不受支持,并且有问题的类是"内部"的,所以我什至无法引用它。
我在搜索时Microsoft.AnalysisServices.AdomdClient.dll
找到了这个 DLL,但没有看到任何与我需要的类相关:https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.adomdclient?view=analysisservices-dotnet
using Microsoft.AnalysisServices.AdomdClient;
try
{
var xmlaFileContents = File.ReadAllText("path/to/your/file.xmla");
using (AdomdCommand cmd = conn.CreateCommand())
{
cmd.CommandText = xmlaFileContents;
cmd.ExecuteNoQuery();
}
}
catch(Exception)
{
}
**请注意,我没有运行此代码**
由于 AdomdConnection 是从 IDbConnection 继承而来的,因此它与 SqlConnection 的工作方式非常相似,因此,可以使用类似的语法,正如@jogi向您展示的那样。
几年前,我编写了一个PS函数,我们在TFS构建中使用了该函数。它使用 .NET 程序集而不是 PS 层,所以我想既然你看起来很精通 PS,你也许可以从中得到一些东西。仍然与@jogi写的本质上相同,只是包裹在 PS 中。
function Invoke-XmlaScript {
[CmdletBinding()] param (
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$ServerInstance,
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$XmlaScript
)
process {
$connection = New-Object Microsoft.AnalysisServices.AdomdClient.AdomdConnection("Data Source=$ServerInstance;Provider=MSOLAP.4;Integrated Security=SSPI;Impersonation Level=Impersonate;")
$connection.Open()
try {
$command = $connection.CreateCommand()
$command.CommandTimeout = 20000
$command.CommandType = [System.Data.CommandType]::Text
$command.CommandText = $Xmla
$reader = $command.ExecuteXmlReader()
if($reader.Read()) {
Write-Output $reader.ReadOuterXml()
}
}
catch { }
$connection.Dispose()
}
}