.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()
}
}
我现在在 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()
}
}