考虑以下情况:
现在,我有一个 C# 应用程序,它解析文件以获取详细信息(表、列等)并启动新的 SQL 连接以执行 SQL 命令以在数据库中创建这些表。
我想要的是创建一个 SQL 项目,我将在其中手动创建这些表,并从 C# 应用程序以编程方式将 SQL 项目发布到某个服务器和数据库。
这可能吗 ?
考虑以下情况:
现在,我有一个 C# 应用程序,它解析文件以获取详细信息(表、列等)并启动新的 SQL 连接以执行 SQL 命令以在数据库中创建这些表。
我想要的是创建一个 SQL 项目,我将在其中手动创建这些表,并从 C# 应用程序以编程方式将 SQL 项目发布到某个服务器和数据库。
这可能吗 ?
如果您在 .NET 4 及更高版本中使用基于sqlproj的项目,则可以使用 Microsoft.Build 命名空间中的类以编程方式相当轻松地构建和发布它。取自我在这里的回答:
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的程序集引用。
您可以通过多种方式完成此操作。在我们的应用程序(约 7 个大型数据库)中,我们使用SQL Server Data Tools中的数据库项目来管理它们。这使我们能够轻松地进行版本控制,并在部署时使用一些很棒的比较工具和大量其他选项。我们确实扩展了我们的解决方案以处理环境中的一些细微差别,但对于大多数人来说这不应该是一个问题。
该工具集的一部分包括 DAC(数据层应用程序),它允许您非常轻松地将项目中的数据库移植到各种环境中。这将支持当今存在的绝大多数项目。
如果您想进行纯程序化,您可以使用 Code First(以及非常灵活的Code First Migrations),这是一种随心所欲的构建,MS 会为您解决剩下的问题(主要是按照惯例,但可以灵活地超越) . 在升级版本方面真的很友好。再次恕我直言。
数据库项目也存在,但往往需要更多的洞察力/工作才能以您想要的方式调整它们(但也提供熟悉的 SQL Explorer 类型布局)。