Di bawah platform .NET, akan lebih mudah untuk menyebarkan solusi Web. Kita dapat menggunakan Visual Studio.NET 2003 untuk menambahkan proyek instalasi WEB, menambahkan output utama dan file konten proyek di "Editor Sistem File" yang diterapkan, dan menyelesaikan program instalasi dengan sangat mudah.
Namun, program instalasi yang dibuat dengan cara ini hanya menginstal file DLL yang dikompilasi oleh halaman Web dan program ASP.NET ke dalam direktori IIS mesin target. Sangat cocok untuk aplikasi umum (seperti database Access, yang dapat dikemas ke dalam program instalasi bersama-sama. ); Jika databasenya adalah SQL SERVER, database perlu diinstal selama penerapan, dan program instalasi akan lebih rumit, dan kita perlu menyesuaikan kelas program instalasi. Jalankan skrip SQL di kelas penginstal dan tulis string koneksi ke Web.config.
l Menginstal database
Microsoft MSDN memperkenalkan pembentukan database saat menyebarkan aplikasi. Misalnya:
Metode ini untuk membuat kelas penginstal dan memanggilnya di kelas penginstal ADO.NET mengeksekusi pernyataan SQL (pernyataan SQL ditempatkan dalam file teks) untuk membuat database.
Namun, ada masalah dengan metode ini. Jika Anda menggunakan SQL Server2000 untuk menghasilkan file skrip untuk semua tabel, tampilan, dan prosedur tersimpan, dan menggunakan ADO.NET untuk mengeksekusi file skrip ini, akan ada banyak pernyataan "GO" di dalamnya. skrip. Terjadi kesalahan. Tentu saja, kita dapat mengganti "GO" dengan karakter baris baru dan menggunakan ADO.NET untuk mengeksekusi pernyataan SQL satu per satu. Tentu saja efisiensi ini relatif rendah.
Cara terbaik adalah memanggil osql untuk menjalankan skrip. (Atau buat file cmd untuk proyek database, dan file cmd juga memanggil osql saat membuat database).
menggunakan Sistem;
menggunakan Sistem.Koleksi;
menggunakan Sistem.ComponentModel;
menggunakan Sistem.Konfigurasi.Instal;
menggunakan Sistem.Data.SqlClient;
menggunakan Sistem.IO;
menggunakan Sistem.Refleksi;
menggunakan Sistem.Diagnostik;
menggunakan System.Xml;
ruang nama DBCustomAction
{
/// <ringkasan>
/// Ringkasan deskripsi DBCustomAction.
/// </ringkasan>
[JalankanInstaller(benar)]
DBCustomAction kelas publik : Sistem.Konfigurasi.Instal.Installer
{
/// <ringkasan>
///@penulis:ditimpa
/// </ringkasan>
komponen System.ComponentModel.Container pribadi = null;
DBCustomAction() publik
{
// Panggilan ini diperlukan oleh desainer.
InitializeComponent();
// TODO: Tambahkan inisialisasi apa pun setelah InitializeComponent dipanggil
}
/// <ringkasan>
/// Bersihkan semua sumber daya yang digunakan.
/// </ringkasan>
dilindungi override void Buang (bool membuang)
{
jika (membuang)
{
jika(komponen != null)
{
komponen.Buang();
}
}
base.Dispose( membuang );
}
#region Kode yang dihasilkan Perancang Komponen
/// <ringkasan>
/// Desainer mendukung metode yang diperlukan - jangan gunakan editor kode untuk memodifikasi
/// Isi dari metode ini.
/// </ringkasan>
kekosongan pribadi InitializeComponent()
{
komponen = Sistem baru.ComponentModel.Container();
}
#endregion
#penyiapan khusus wilayah
kekosongan pribadi ExecuteSql(string connString,string Nama Basis Data,string sql)
{
Sambungan SqlConnection=SqlConnection baru(sambunganString);
SqlCommand cmd=baru SqlCommand(sql,sambungan);
samb.Buka();
cmd.Connection.ChangeDatabase(NamaDatabase);
mencoba
{
cmd.ExecuteNonQuery();
}
menangkap (Pengecualian e)
{
StreamWriter w=StreamWriter baru(@"e:\log.txt",true);
w.WriteLine("===di ExecuteSql=======");
w.WriteLine(e.ToString());
w.Tutup();
}
Akhirnya
{
samb.Tutup();
}
}
penggantian publik batal Instal (IDictionary stateSaver)
{
buatDB();
perbaruiConfig();
}
kekosongan pribadi createDB()
{
mencoba
{
string connString=string.Format("server={0};id pengguna={1};kata sandi={2}",ini.Konteks.Parameter["server"],ini.Konteks.Parameter["pengguna"], this.Context.Parameters["pwd"]);
//Membuat database berdasarkan nama database yang dimasukkan
ExecuteSql(connString,"master","create database "+this.Context.Parameters["dbname"]);
//Memanggil osql untuk menjalankan skrip
string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",ini.Konteks.Parameter["server"],ini .Context.Parameters["user"],this.Context.Parameters["pwd"],this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
Sistem.Diagnostik.Proses sqlProcess=Proses baru();
sqlProcess.StartInfo.FileName="osql.exe";
sqlProcess.StartInfo.Argumen=cmd;
sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Tersembunyi;
sqlProses.Mulai();
sqlProcess.WaitForExit();//Menunggu eksekusi
sqlProcess.Close();
//Hapus file skrip
System.IO.FileInfo sqlFileInfo=fileInfo baru(string.Format("{0}db.sql",this.Context.Parameters["targetdir"]));
if(sqlFileInfo.Ada)
sqlFileInfo.Hapus();
}
menangkap (Pengecualian e)
{
StreamWriter w=StreamingWriter baru(@"e:log.txt",true);
w.WriteLine("===dalam Instal=======");
w.WriteLine(e.ToString());
w.Tutup();
}
}
kekosongan pribadi updateConfig()
{
mencoba
{
//Tulis string koneksi ke Web.config
string.Format
("{0}web.config",this.Context.Parameters["targetdir"]));
throw new InstallException("tidak dapat menemukan web.config");
XmlDocument doc=new XmlDocument();
doc.Load(fileInfo.Nama Lengkap);
bool foundIt=false;
string connString=string.Format("server={0};database={1};id pengguna={2};kata sandi={3}",ini.Konteks.Parameter["server"], ini.Konteks.Parameter["namadb"],ini.Konteks.Parameter["pengguna"],ini.Konteks.Parameter["pwd"]);
string enCS=SecurityHelper.EncryptDBConnectionString(connString)
; ("//appSettings/add[@key='connString']");
jika(tidak!=batal)
{
no.Attributes.GetNamedItem("value").Value=enCS;
ditemukanItu=benar;
}
jika(!ditemukan)
throw new InstallException("tidak dapat menemukan pengaturan connString ");
doc.Simpan(fileInfo.Nama Lengkap);
}
menangkap (Pengecualian e)
{
StreamWriter w=StreamingWriter baru(@"e:log.txt",true);
w.WriteLine("===dalam updata connstring=tjtj=====");
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.Tutup();
}
}
#wilayah akhir
}
}