.NET プラットフォームでは、Web ソリューションを展開するのがより便利です。 Visual Studio.NET 2003 を使用すると、WEB インストール プロジェクトを追加し、展開された「ファイル システム エディタ」にプロジェクトのメイン出力ファイルとコンテンツ ファイルを追加して、インストール プログラムを非常に簡単に完了できます。
ただし、この方法で作成されたインストール プログラムは、Web ページと ASP.NET プログラムによってコンパイルされた DLL ファイルをターゲット マシンの IIS ディレクトリにインストールするだけです。これは、パッケージ化できる Access データベースなどの一般的なアプリケーションに適しています。インストール プログラムも一緒にします。); データベースが SQL SERVER の場合、展開時にデータベースをインストールする必要があり、インストール プログラムはより複雑になり、インストール プログラム クラスをカスタマイズする必要があります。インストーラー クラスで SQL スクリプトを実行し、接続文字列を Web.config に書き込みます。
l データベースのインストール
Microsoft MSDN では、アプリケーションの展開時にデータベースを確立することが導入されています。例:
このメソッドは、インストーラー クラスを作成し、インストーラー クラス内で呼び出します。 ADO.NET は SQL ステートメントを実行して (SQL ステートメントはテキスト ファイルに配置されます)、データベースを作成します。
ただし、この方法には問題があります。SQL Server2000 を使用してすべてのテーブル、ビュー、ストアド プロシージャのスクリプト ファイルを生成し、ADO.NET を使用してこのスクリプト ファイルを実行すると、多くの "GO" ステートメントが存在します。スクリプトでエラーが発生しました。もちろん、「GO」を改行文字に置き換え、ADO.NET を使用して SQL ステートメントを 1 つずつ実行することもできます。明らかに、この効率は比較的低いです。
最良の方法は、osql を呼び出してスクリプトを実行することです。 (または、データベース プロジェクトの cmd ファイルを作成します。データベースの作成時に cmd ファイルも osql を呼び出します)。
システムを使用する;
System.Collections を使用します。
System.ComponentModel を使用します。
System.Configuration.Install を使用します。
System.Data.SqlClient を使用します。
System.IO を使用します。
System.Reflection を使用します。
System.Diagnostics を使用します。
System.Xml
名前空間 DBCustomAction
を使用します。
{
/// <概要>
/// DBCustomAction の概要説明。
/// </概要>
[インストーラーの実行(true)]
パブリック クラス DBCustomAction : System.Configuration.Install.Installer
{
/// <概要>
///@作者:オーバーレッド
/// </概要>
プライベート
System.ComponentModel.Container コンポーネント = null;
{
// この呼び出しは設計者によって必要とされます。
InitializeComponent();
// TODO: InitializeComponent が呼び出された後に初期化を追加します。
}
/// <概要>
/// 使用中のすべてのリソースをクリーンアップします。
/// </概要>
protected オーバーライド void Dispose( bool disposing)
{
もし(処分する)
{
if(コンポーネント != null)
{
コンポーネント.Dispose();
}
}
Base.Dispose( 処分 );
}
#region コンポーネント デザイナーが生成したコード
/// <概要>
/// デザイナーは必要なメソッドをサポートしています - 変更にはコード エディターを使用しないでください
/// このメソッドの内容。
/// </概要>
private void InitializeComponent()
{
コンポーネント = 新しい System.ComponentModel.Container();
}
#endregion
#region カスタム セットアップ
private void ExecuteSql(string connString,string データベース名,string sql)
{
SqlConnection conn=new SqlConnection(connString);
SqlCommand cmd=new SqlCommand(sql,conn);
conn.Open();
cmd.Connection.ChangeDatabase(データベース名);
試す
{
cmd.ExecuteNonQuery();
}
catch(例外 e)
{
StreamWriter w=new StreamWriter(@"e:\log.txt",true);
w.WriteLine("===ExecuteSql=======);
w.WriteLine(e.ToString());
w.Close();
}
ついに
{
conn.Close();
}
public
オーバーライド void Install(IDictionary stateSaver)
{
createDB();
updateConfig();
プライベート
void createDB()
{
試す
{
string connString=string.Format("サーバー={0};ユーザーID={1};パスワード={2}",this.Context.Parameters["サーバー"],this.Context.Parameters["ユーザー"], this.Context.Parameters["pwd"]);
//入力されたデータベース名に基づいてデータベースを作成します
ExecuteSql(connString,"master","create database "+this.Context.Parameters["dbname"]);
//スクリプトを実行するために osql を呼び出します。
string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",this.Context.Parameters["server"],this .Context.Parameters["user"],this.Context.Parameters["pwd"],this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
System.Diagnostics.Process sqlProcess=new Process();
sqlProcess.StartInfo.FileName="osql.exe";
sqlProcess.StartInfo.Arguments=cmd;
sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlProcess.Start();
sqlProcess.WaitForExit();//実行待ち
sqlProcess.Close();
//スクリプトファイルを削除します。
System.IO.FileInfo sqlFileInfo=new FileInfo(string.Format("{0}db.sql",this.Context.Parameters["targetdir"]));
if(sqlFileInfo.Exists)
sqlFileInfo.Delete();
}
catch(例外 e)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===インストール=======);
w.WriteLine(e.ToString());
w.Close();
}
プライベート
void updateConfig()
{
試す
{
// 接続文字列を Web.config に書き込みます
System.IO.FileInfo fileInfo=new FileInfo(string.Format("{0}web.config",this.Context.Parameters["targetdir"]))
;
throw new InstallException("web.config が見つかりません");
XmlDocument doc=new XmlDocument();
doc.Load(ファイル情報.フルネーム);
bool foundIt=false;
string connString=string.Format("server={0};database={1};user id={2};password={3}",this.Context.Parameters["server"], this.Context.Parameters["dbname"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);
string
enCS=SecurityHelper.EncryptDBConnectionString(connString);
("//appSettings/add[@key='connString']");
if(いいえ!=null)
{
no.Attributes.GetNamedItem("値").Value=enCS;
見つかった = true;
if
(!foundIt)
throw new InstallException("connString 設定が見つかりません ");
doc.Save(fileInfo.FullName);
}
catch(例外 e)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===更新データ connstring=tjtj======);
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.Close();
}
#エンド
リージョン
}
}