ضمن النظام الأساسي .NET، يكون نشر حلول الويب أكثر ملاءمة. يمكننا استخدام Visual Studio.NET 2003 لإضافة مشروع تثبيت WEB، وإضافة ملفات الإخراج والمحتوى الرئيسية للمشروع في "محرر نظام الملفات" المنشور، وإكمال برنامج التثبيت بسهولة شديدة.
ومع ذلك، فإن برنامج التثبيت الذي تم إنشاؤه بهذه الطريقة يقوم فقط بتثبيت ملفات DLL التي تم تجميعها بواسطة صفحة الويب وبرنامج ASP.NET في دليل IIS الخاص بالجهاز الهدف، وهو مناسب للتطبيقات العامة (مثل قواعد بيانات Access، والتي يمكن تجميعها في برنامج التثبيت معًا ); إذا كانت قاعدة البيانات هي SQL Server، فيجب تثبيت قاعدة البيانات أثناء النشر، وسيكون برنامج التثبيت أكثر تعقيدًا، وسنحتاج إلى تخصيص فئة برنامج التثبيت. قم بتنفيذ البرنامج النصي SQL في فئة المثبت واكتب سلسلة الاتصال إلى Web.config.
l تثبيت قاعدة البيانات
يقدم Microsoft MSDN إمكانية إنشاء قاعدة بيانات عند نشر التطبيقات. على سبيل المثال:
هذه الطريقة هي إنشاء فئة المثبت واستدعائها في فئة المثبت ينفذ ADO.NET عبارات SQL (يتم وضع عبارات SQL في ملف نصي) لإنشاء قاعدة بيانات.
ومع ذلك، هناك مشكلة في هذه الطريقة. إذا كنت تستخدم SQL Server2000 لإنشاء ملف نصي لكافة الجداول وطرق العرض والإجراءات المخزنة، واستخدمت ADO.NET لتنفيذ ملف البرنامج النصي هذا، فسيكون هناك العديد من عبارات "GO" في هذا الأسلوب. حدث خطأ في البرنامج النصي. بالطبع، يمكننا استبدال "GO" بحرف السطر الجديد واستخدام ADO.NET لتنفيذ عبارات SQL واحدة تلو الأخرى. ومن الواضح أن هذه الكفاءة منخفضة نسبيا.
أفضل طريقة هي استدعاء osql لتنفيذ البرنامج النصي. (أو قم بإنشاء ملف cmd لمشروع قاعدة بيانات، ويقوم ملف cmd أيضًا باستدعاء osql عند إنشاء قاعدة البيانات).
باستخدام النظام؛
باستخدام System.Collections؛
باستخدام System.ComponentModel؛
باستخدام System.Configuration.Install؛
باستخدام System.Data.SqlClient؛
باستخدام System.IO؛
باستخدام System.Reflection؛
باستخدام System.Diagnostics؛
باستخدام System.Xml؛
مساحة الاسم DBcustomAction
{
/// <الملخص>
/// وصف موجز لـ DBCustomAction.
/// </الملخص>
[تشغيل المثبت (صحيح)]
الفئة العامة DBCustomAction: System.Configuration.Install.Installer
{
/// <الملخص>
///@ المؤلف: overred
/// </الملخص>
مكونات System.ComponentModel.Container الخاصة = فارغة؛
public DBCustomAction()
{
// هذه المكالمة مطلوبة من قبل المصمم.
InitializeComponent();
// TODO: أضف أي تهيئة بعد استدعاءInitializeComponent
}
/// <الملخص>
/// تنظيف جميع الموارد المستخدمة.
/// </الملخص>
التخلص من الفراغ المحمي (التخلص المنطقي)
{
إذا (التخلص)
{
إذا (المكونات! = فارغة)
{
المكونات. التخلص();
}
}
base.Dispose( Disposition);
}
# رمز المنطقة الذي أنشأه مصمم المكونات
/// <الملخص>
/// يدعم المصمم الطرق المطلوبة - لا تستخدم محرر التعليمات البرمجية للتعديل
/// محتوى هذه الطريقة.
/// </الملخص>
الفراغ الخاص ()InitializeComponent
{
المكونات = new System.ComponentModel.Container();
}
#endregion
#region الإعداد المخصص
ExecuteSql باطلة خاصة (سلسلة connString، سلسلة DatabaseName، سلسلة SQL)
{
SqlConnection conn=new SqlConnection(connString);
SqlCommand cmd=new SqlCommand(sql,conn);
conn.Open();
cmd.Connection.ChangeDatabase(DatabaseName);
يحاول
{
cmd.ExecuteNonQuery();
}
قبض (استثناء ه)
{
StreamWriter w=new StreamWriter(@"e:\log.txt",true);
w.WriteLine("===in ExecuteSql======");
w.WriteLine(e.ToString());
w.Close();
}
أخيراً
{
conn.Close();
}
}
تجاوز عام تثبيت باطل (IDictionary StateSaver)
{
createDB();
updateConfig();
}
createDB () باطلة خاصة
{
يحاول
{
string connString=string.Format("server={0};user id={1};password={2}",this.Context.Parameters["server"],this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
// إنشاء قاعدة بيانات بناءً على اسم قاعدة البيانات المُدخلة
ExecuteSql(connString,"master",create قاعدة البيانات "+this.Context.Parameters["dbname"]);
// استدعاء osql لتنفيذ البرنامج النصي
سلسلة cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql"،this.Context.Parameters["server"]،هذا .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"]));
إذا (sqlFileInfo. موجود)
sqlFileInfo.Delete();
}
قبض (استثناء ه)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===in Install======");
w.WriteLine(e.ToString());
w.Close();
}
}
تحديث باطل خاص ()
{
يحاول
{
// اكتب سلسلة الاتصال إلى Web.config
System.IO.FileInfo fileInfo=new FileInfo(string.Format("{0}web.config",this.Context.Parameters["targetdir"]));
if(!fileInfo.Exists)
throw new InstallException("لا يمكن العثور على web.config");
XmlDocument doc=new XmlDocument();
doc.Load(fileInfo.FullName);
bool FoundIt=false;
string connString=string.Format("server={0};database={1};معرف المستخدم={2};password={3}",this.Context.Parameters["server"], this.Context.Parameters["dbname"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);
string enCS=SecurityHelper.EncryptDBConnectionString(
XmlNode no=doc.SelectSingleNode)
;("//appSettings/add[@key='connString']");
إذا (لا! = فارغة)
{
no.Attributes.GetNamedItem("value").Value=enCS;
FoundIt=true;
}
إذا (! وجدت)
طرح InstallException جديد ("لا يمكن العثور على إعداد connString")؛
doc.Save(fileInfo.FullName);
}
قبض (استثناء ه)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===in updata connstring=tjtj=====");
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.Close();
}
}
#endregion
}
}