گاهی پیش میاد که لازمه دیتابیس هم همراه با برنامه نصب بشه.یکی از راههای ممکن استفاده از مقاله خانم بیتا هست.اون روش به اندازه کافی کارآمد هست اما من اینجا یه روشی رو میگم که شما خوده دیتابیس رو Attach میکنین.شاید لازم بوده مقادیر اولیه ای رو داخل دیتابیس قرار بدین در این روش دیگه لازم نیست اسکریپت اضافه کردن این مقادیر اولیه رو بنویسین بلکه سر و کار ما با خوده فایل دیتا بیس هست.
نکته کلیدی در این پروژه استفاده از SQL Server Management Objects (SMO) هست . SMO راهی است برای مدیریت اشیای SQL Server .برای این مدیریت اصلا لازم نیست از دستورات SQL استفاده بشه بلکه دات نت همه کارها رو برای ما میکنه. ما میتونیم دیتابیس ایجاد کنیم. درونش جدول و یا Store Procedure ایجاد کنیم و ...
خوب برای رسیدن به هدف پروژمون یه پروژه ساده بسازین که یه گرید داشته باشه و اونم یه یکی از جداول دیتابیس مورد نظر شما وصل باشه. برنامتون رو یه دور تست کنین و مطوئن بشین که همه چیز به درستی کار میکنه .
[RunInstaller(true)]
public partial class Installer1 : Installer
{
string path;
public Installer1()
{
InitializeComponent();
}
private void AttachDB()
{
try
{
SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=InstallDB;Integrated Security=True");
Assembly asm = Assembly.GetExecutingAssembly();
path = System.IO.Path.GetDirectoryName(asm.GetName().CodeBase);
path = path.Substring(6) + "\\DB\\";
Server SqlServer = new Server();
//System.Windows.Forms.MessageBox.Show(path);
string DatabaseName = "InstallDB";
ServerConnection SqlServerConnection = SqlServer.ConnectionContext;
if (SqlServer.Databases[DatabaseName] == null)
{
Database NewDatabase = new Database(SqlServer, DatabaseName);
FileGroup DatabaseFileGroup = new FileGroup(NewDatabase, "PRIMARY");
NewDatabase.FileGroups.Add(DatabaseFileGroup);
DataFile DatabaseDataFile = new DataFile(DatabaseFileGroup, DatabaseName);
DatabaseFileGroup.Files.Add(DatabaseDataFile);
DatabaseDataFile.FileName = path + "InstallDB.mdf";
LogFile DatabaseLogFile = new LogFile(NewDatabase, DatabaseName + "_log");
NewDatabase.LogFiles.Add(DatabaseLogFile);
DatabaseLogFile.FileName = path + "InstallDB_log.ldf";
NewDatabase.Create(true);
}
else
System.Windows.Forms.MessageBox.Show("این دیتابیس وجود دارد");
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.InnerException.InnerException.ToString());
}
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
//System.IO.File.Create(@"c:\t.txt");
AttachDB();
}
public override void Uninstall(System.Collections.IDictionary savedState)
{
base.Uninstall(savedState);
Server SqlServer = new Server();
string DatabaseName = "InstallDB";
if (SqlServer.Databases[DatabaseName] != null)
{
SqlServer.DetachDatabase(DatabaseName, true);
}
//Assembly asm = Assembly.GetExecutingAssembly();
//path = System.IO.Path.GetDirectoryName(asm.GetName().CodeBase);
//path = path.Substring(6) + "\\DB\\";
//System.IO.File.Delete(path + DatabaseName + ".mdf");
//System.IO.File.Delete(path + DatabaseName + "_log.ldf");
}
}
یه پروژه جدید از نوع Setup Project به سولوشن اضافه کنین .من داخل ویوی File System یک پوشه به اسم DB قرار ایجاد کردم فایلهای دیتابیس (mdf و ldf ) رو به داخل اون منتقل کرد خاصیت AlwaysCreate رو به true و DeafultLocation رو به [TARGETDIR]\DB تغییر دادم. بعد از تنظیمات مربوطه که پروژه قبلی رو ست آپ کنه به ویوی Custom Action برین و برای رویدادهای Commit و UnInstall رو (همونطوری که نمونش در فیلم آموزش خانم بیتا هست) به پروژه ای که کلاس Installer داره نسبت بدین تا در موقع اتفاق افتادن ایونتهای مورد نظر کده مورد نظر اجرا بشه . من یه تیکه کد کامنت شده نوشتم که دیتابیس رو بعد از UnInstall پاک میکنه شما هر کاری دوست دارین میتونین بکنین اعم از اینکه به پوشه ای دیگه ای منتقلشون کنین امیوارم که مفید باشه.
هیچ نظری موجود نیست:
ارسال یک نظر