SQL Server Integration Services: Failed to open project file. The data format is invalid … (Microsoft.SqlServer.ManagedDTS)

Problem

Für den Austausch und Transfer von Daten wurde ein SQL Server Integration Services Paket (ispac) mithilfe der Assembly Microsoft.SqlServer.ManagedDTS generiert.

Beim Versuch, dieses Paket zu deployen erscheint folgende Fehlermeldung:

Abbildung zeigt Fehlermeldung Failed to open project file. The data format is invalid with error «Der komprimierte Teil hat eine inkonsistente Datenlänge.» (Microsoft.SqlServer.ManagedDTS)
Abbildung zeigt Fehlermeldung Failed to open project file. The data format is invalid with error «Der komprimierte Teil hat eine inkonsistente Datenlänge.» (Microsoft.SqlServer.ManagedDTS) Die Lösung für diese Fehlermeldung wird im Blogbeitrag beschrieben.

Aktion

Um den Fehler eingrenzen zu können, extrahierten wir das generierte ispac-Paket. Dabei stellte sich heraus, dass die [Content_Types].xml nicht korrekt entpackt werden konnte.

Abbildung zeigt Fehler beim extrahieren der XML-Datei
Abbildung zeigt Fehler beim extrahieren der XML-Datei

Bei der Analyse, warum die Basisinfrastruktur diese Fehler erzeugten, schauten wir auf den Code-Block, der für die Erstellung des ispac-Paket zuständig ist.

var project = Project.CreateProject();
project.Name = name;
project.ProtectionLevel = DTSProtectionLevel.DontSaveSensitive;
project.Description = "Synchronisierung Navision";
// ...
var path = Path.Combine(_scriptPath, $"{name}.ispac");
_log.Log($"Paket abgelegt unter {path}");
project.SaveAs(path);

Solution

Das erstellte Projekt ist noch nicht geschlossen. Dadurch wird die Datei korrupt, was zu einen Deployment-Fehler führt. Mit der Verwendung von using lässt sich dieses Problem beheben.

using (var project = Project.CreateProject())
{
    project.Name = name;
    project.ProtectionLevel = DTSProtectionLevel.DontSaveSensitive;
    project.Description = "Synchronisierung Navision";
    // ...
    var path = Path.Combine(_scriptPath, $"{name}.ispac");
    _log.Log($"Paket abgelegt unter {path}");
    project.SaveAs(path);
}

Nach dieser Anpassung kann das generierte Paket erfolgreich verteilt werden.

Abbildung zeigt erfolgreiches Deployment nach Anpassung
Die Abbildung zeigt ein erfolgreiches Deployment im Integration Services Deployment Wizard nach Anpassung.

Ein kleines using mit grosser Wirkung.