让我们说我有一个sql server数据工具项目(SSDT)和一堆集成/端到端测试(故意不说单元测试)。有没有办法通过测试类库中的代码TearDown并重新发布现有的测试数据库?
PS:
我目前正在尝试这个(路径和文件名简化):
var p = new System.Diagnostics.Process
{
StartInfo =
{
FileName =
@"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe /Action:Publish /SourceFile:“D:\Database_20151114_18-23-29.dacpac” Profile:”D:\LocalDatabase.publish.xml”",
UseShellExecute = true
}
};
p.Start();
不幸的是,我得到了:
{"The system cannot find the file specified"}
dacpac和xml文件绝对存在。有任何想法吗?另外,是否可以自动创建最新的dacpac文件?
答案 0 :(得分:1)
假设在运行测试的计算机上安装了SSDT,您可以通过TearDown中的shell命令运行 sqlpackage.exe 。 sqlpackage.exe是SSDT用来发布数据库的。
[TearDown]
public void TearDown() {
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe /Action:Publish /SourceFile:C:\DbProject\bin\Debug\DbProject.dacpac /TargetServerName:localhost /TargetDatabaseName:TestDb";
p.StartInfo.UseShellExecute = true;
p.Start();
}
有关sqlpackage.exe参数的信息,请参阅here。请注意,sqlpackage.exe可能与我上面使用的路径不同。
答案 1 :(得分:1)
这样的事情似乎可以解决问题:
const string dacPacFileName = @"D:\Bla.dacpac";
var connectionString = ConfigurationManager.ConnectionStrings["BlaConnectionString"].ConnectionString;
var dacPackage = DacPackage.Load(dacPacFileName);
var dacServices = new DacServices(connectionString);
var dacOptions = new DacDeployOptions();
dacOptions.CreateNewDatabase = true;
dacServices.Deploy(dacPackage, "Bla", true, dacOptions);
但是,它仍然需要手动创建dapac文件。这也可以自动化吗?
答案 2 :(得分:1)
是的,绝对有可能使整个过程自动化。大致是这样的:
Microsoft.Build
库的引用Microsoft.SqlServer.Dac
库的引用此excellent existing answer包含有关操作方法的所有详细信息。