2017-07-20 5 views
1

Utilise actuellement les outils de ligne cmd SqlPackage.exe pour générer un script, en comparant le fichier DacPac à une base de données cible. Cela va Create the database if it doesn't already exist.SSDT Comment puis-je créer une nouvelle base de données à partir d'un fichier DACPAC?

Nous souhaitons maintenant utiliser le package Microsoft.Data.Tools.Msbuild Nuget (en utilisant C# pour déployer), mais l'utilisation de SchemaComparison to Compare échouera lorsque le conteneur de base de données n'existe pas. Il ne semble pas y avoir beaucoup de documentation liée à l'emballage.

Y a-t-il des outils dans le cadre de ce package qui me permettront de créer un conteneur de base de données vide avant de comparer?

J'utilise actuellement le code suivant (qui fonctionne lorsque l'on compare contre une base de données existante):

SchemaCompareDacpacEndpoint sourceDacpac = new SchemaCompareDacpacEndpoint(@"C:\DeployDB.dacpac"); 

     SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder(); 
     csb.DataSource = @"."; 
     csb.InitialCatalog = "DeployTestDB"; 
     csb.IntegratedSecurity = true; 
     SchemaCompareDatabaseEndpoint targetDatabase = new SchemaCompareDatabaseEndpoint(csb.ToString()); 


     SchemaComparison comparison = new SchemaComparison(sourceDacpac, targetDatabase); 
     comparison.Options.DropObjectsNotInSource = true; 
     comparison.Options.BlockOnPossibleDataLoss = false; 
     comparison.Options.TreatVerificationErrorsAsWarnings = true; 
     comparison.Options.ScriptDatabaseOptions = true; 
     comparison.Options.GenerateSmartDefaults = true; 

     SchemaComparisonResult comparisonResult = comparison.Compare(); 

à ce stade, le ComparisonResult a un message d'erreur de: {Erreur SQL0: Impossible base de données ouverte "DeployTestDB" demandé par le login. La connexion a échoué. La connexion a échoué pour l'utilisateur 'myUsername'.}

+0

Pas exactement ce que vous demandez, mais pourquoi pas de créer la base de données manuellement si elle n'existe pas? s'il n'existe pas (sélectionnez * dans sys.databases où name = 'test') créez un test de base de données; –

Répondre

0

Jetez un coup d'œil à la classe DacServices dans Microsoft.SqlServer.Dac.dll.

Le code ressemblerait à quelque chose comme ceci:

using Microsoft.SqlServer.Dac; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     DacServices ds = new DacServices(@"Data Source=SERVERNAME;Initial Catalog=DATABASENAME;Integrated Security=true"); 
     using (DacPackage dp = DacPackage.Load(@"C:\temp\mydb.dacpac")) 
     { 
      ds.Deploy(dp, @"DATABASENAME", upgradeExisting: false, options: null, cancellationToken: null); 
     } 
    } 
}