【发布时间】:2015-11-30 15:52:48
【问题描述】:
我们有SQLServer01.Publish.xml,当我双击这个文件并发布时,它会将一个数据库发布到sqlServer01。
我想问一下,我们能否以某种方式从代码中发布此配置文件?
【问题讨论】:
-
像这样调用
msbuildblog.danskingdom.com/…
标签: c# .net sql-server vb.net sql-server-data-tools
我们有SQLServer01.Publish.xml,当我双击这个文件并发布时,它会将一个数据库发布到sqlServer01。
我想问一下,我们能否以某种方式从代码中发布此配置文件?
【问题讨论】:
msbuildblog.danskingdom.com/…
标签: c# .net sql-server vb.net sql-server-data-tools
SSDT 似乎喜欢 DacPac 的这种东西。 Microsoft.SqlServer.Dac 中有一个 DacServices 实用程序类。我认为这将需要在您计划运行此代码的机器上安装 SSDT。
public class DacPacUtility
{
public void DeployDacPac( string connString, string dacpacPath, string targetDbName )
{
var dbServices = new DacServices( connString );
var dbPackage = DacPackage.Load( new FileStream( dacpacPath, FileMode.Open, FileAccess.Read ), DacSchemaModelStorageType.Memory, FileAccess.Read );
var dbDeployOptions = new DacDeployOptions()
{
SqlCommandVariableValues =
{
new KeyValuePair< string, string >( "debug", "false" )
},
CreateNewDatabase = true,
BlockOnPossibleDataLoss = false,
BlockWhenDriftDetected = false
};
dbServices.Deploy( dbPackage, targetDbName, upgradeExisting : true, options : dbDeployOptions );
}
}
奖励:您可以使用 Microsoft.Build.Evaluation.Project 命名空间新建一个 Project 对象并在本地构建它以使用生成的构建 dacpac 初始化测试进行集成测试。
[SetUpFixture]
public class TestSetup
{
[SetUp]
public void SetUpTests()
{
var projectPath = @"C:SomeDirectory";
var project = new Project( projectPath );
project.Build();
ProjectCollection.GlobalProjectCollection.UnloadProject( project );
var dacPac = new DacPacUtility();
var connString = "Data Source=(localdb)\ProjectsV12;Initial Catalog=Tests;Integrated Security=True";
var dacPacPath = projectPath + "..\bin\projectName.dacpac";
dacPac.DeployDacPac(connString, dacPacPath, "Tests");
}
[TearDown]
public void TearDownTests()
{
// TODO: delete db or run other cleanup scripts
}
}
参考文献:
Deborah's Developer MindScape: Deploying A DACPAC
在哪里可以得到Microsoft.SqlServer.Dac 和DacService
有两种方法可以获取Microsoft.SqlServer.Dac 库:
【讨论】:
new FileStream 来加载 dacpac;如果您依赖于另一个 dacpac,例如 master.dacpac,并且 SDK 未部署在运行该代码的机器上,它将无法在同一目录中找到它(引擎尝试执行的操作)因为从引擎的角度来看,没有目录,只有一个流。相反,只需传递文件的路径,让引擎处理它。