次の状況を考慮してください。
現在、詳細 (テーブル、列など) を取得するためにファイルを解析し、SQL コマンドを実行してデータベースにそれらのテーブルを作成するために新しい SQL 接続を開始する C# アプリケーションがあります。
私が望むのは、これらのテーブルを手動で作成する SQL プロジェクトを作成し、C# アプリケーションからプログラムで SQL プロジェクトを特定のサーバーとデータベースに公開することです。
これは可能ですか?
次の状況を考慮してください。
現在、詳細 (テーブル、列など) を取得するためにファイルを解析し、SQL コマンドを実行してデータベースにそれらのテーブルを作成するために新しい SQL 接続を開始する C# アプリケーションがあります。
私が望むのは、これらのテーブルを手動で作成する 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 タイプのレイアウトも提供します)。