.xmla 使用 C# 部署到 SQL

.xmla deployment to SQL using C#

我现在在 PowerShell 中使用 Invoke-ASCmd 在 SQL 服务器中创建一个数据库,如下所示:

Invoke-ascmd -Query $MyScript -Server $ASServer

其中 $MyScript 是一个字符串,其中包含我之前读取的 .xmla 文件的内容。

效果很好。现在我需要在 C# 中做一些类似的事情,但我无法找到像 PowerShell 中存在的那样的简单解决方案。

我看到有些人使用了一个名为 Microsoft.AnalysisServices.XMLA.dll 的 Microsoft DLL,但它不受支持,而问题中的 class 是 "internal",所以我什至无法引用它。

我在四处搜索时发现了这个 DLL Microsoft.AnalysisServices.AdomdClient.dll,但没有看到任何 class 与我需要的相关:https://docs.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()
}

}