我如何以编程方式发布SQL Server数据库项目?

时间:2012-12-12 16:17:22

标签: c# sql sql-server visual-studio-2010

考虑以下情况:

现在,我有一个C#应用程序解析文件以获取详细信息(表,列等)并启动新的SQL连接以执行SQL命令以在数据库中创建这些表。

我想要的是创建一个SQL项目,我将在其中手动创建这些表,并且我希望以编程方式将SQL项目发布到某个服务器和数据库。

这可能吗?

2 个答案:

答案 0 :(得分:6)

如果您在.NET 4及更高版本中使用基于 sqlproj 的项目,则可以使用Microsoft.Build命名空间中的类以编程方式构建和发布它。取自我的回答here

using Microsoft.Build.Framework;
using Microsoft.Build.Execution;

public void UpdateSchema() {
    var props = new Dictionary<string, string> {
        { "UpdateDatabase", "True" },
        { "PublishScriptFileName", "schema-update.sql" },
        { "SqlPublishProfilePath", "path/to/publish.xml") }
    };

    var projPath = "path/to/database.sqlproj";

    var result = BuildManager.DefaultBuildManager.Build(
        new BuildParameters { Loggers = new[] { new ConsoleLogger() } },
        new BuildRequestData(new ProjectInstance(projPath, props, null), new[] { "Publish" }));

    if (result.OverallResult == BuildResultCode.Success) {
        Console.WriteLine("Schema update succeeded!");
    }
    else {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Schema update failed!");
        Console.ResetColor();
    }
}

private class ConsoleLogger : ILogger
{
    public void Initialize(IEventSource eventSource) {
        eventSource.ErrorRaised += (sender, e) => {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(e.Message);
            Console.ResetColor();
        };
        eventSource.MessageRaised += (sender, e) => {
            if (e.Importance != MessageImportance.Low)
                Console.WriteLine(e.Message);
        };
    }
    public void Shutdown() { }
    public LoggerVerbosity Verbosity { get; set; }
    public string Parameters { get; set; }
}

这适用于.NET 4及更高版本。请确保并包含 Microsoft.Build Microsoft.Build.Framework 的程序集引用。

答案 1 :(得分:1)

有很多方法可以实现这一目标。在我们的应用程序(~7个大型数据库)中,我们使用SQL Server Data Tools中的数据库项目管理它们。这使我们可以轻松地进行版本控制,并在部署时做一些很棒的比较工具以及许多其他选项。我们确实扩展了我们的环境,以应对环境中的一些细微差别,但对于大多数人来说这应该不是问题。

该工具集的一部分包括DAC(数据层应用程序),它允许您将项目中的数据库移植到各种环境中。这将支持当今存在的绝大多数项目。

如果你想要进行纯编程,你可以使用Code First(和Code First Migrations非常光滑),这是一种构建,MS将为你找出其余部分(主要是按惯例,但灵活性)超越那个)。在升级版本时它非常友好。恕我直言。

数据库项目也存在,但往往需要更多的洞察力/工作来按照您想要的方式进行调整(但也提供熟悉的SQL Explorer类型布局)。