JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

-->
الصفحة الرئيسية

عمل Automatically Attach Database Sql Server

 

السلام عليكم ورحمة الله وبركاته


أحيانا نريد عمل Attach لقاعدة البيانات على جهاز العميل لأول مرة يعمل البرنامج على جهازه

اذا كنت تتعامل فى بيئة التطوير مع EntityFramework فيجب ان تشاهد هذا الدرس عمل Migration عن   طريق Database Initializer الجزء الخاص CreateDatabaseIfNotExists



اما اذا كنت تتعامل مع Ado.net طبق معنا هذا الدرس .

 داخل مشروعك الذى تتعامل معه بـ Ado مع قاعدة البيانات وفى النافذة الأولى التى تفتح عند تشغيل البرنامج

اكتب هذه Functions 
 
 

 public static bool GETATTACHDATABASENAME()
        {
            DataSet DS = new DataSet();
            System.Data.SqlClient.SqlConnection SqlConnection1 = new System.Data.SqlClient.SqlConnection("Data Source=" + System.Environment.MachineName + @"\SQLEXPRESS" + ";Initial Catalog=tempdb;Integrated Security=SSPI;");
            string str = "Select DISTINCT name from master.dbo.sysdatabases where name Like 'DatabaseName' and has_dbaccess(Name) = 1 ";
            System.Data.SqlClient.SqlDataAdapter ADP;
            ADP = new System.Data.SqlClient.SqlDataAdapter(str, SqlConnection1);
            DS.Clear();
            ADP.Fill(DS);
            bool i;
            if (DS.Tables[0].Rows.Count == 0)
            {
                MessageBox.Show(" قاعدة بيانات البرنامج غير متصلة بالسرفر جارى عمل الاتصال", System.Environment.MachineName, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading);
                i = false;
            }
            else
            {
                i = true;
            }
            ADP.Dispose();
            SqlConnection1.Dispose();
            return i;
        }

        public static void ATTACHDATABASENAME(string MYDBNAME, string f1lepathprimary, string f1lepathlog)
        {
            try
            {
                System.Data.SqlClient.SqlConnection SqlConnection1 = new System.Data.SqlClient.SqlConnection("Data Source=" + System.Environment.MachineName + @"\SQLEXPRESS" + ";Initial Catalog=tempdb;Integrated Security=SSPI;");
                System.Data.SqlClient.SqlCommand CMD = new System.Data.SqlClient.SqlCommand();
                CMD.CommandType = CommandType.Text;
                CMD.Connection = SqlConnection1;
                if (SqlConnection1.State == ConnectionState.Open)
                    SqlConnection1.Close();
                SqlConnection1.Open();
                CMD.CommandText = "sp_attach_db " + MYDBNAME + ",'" + f1lepathprimary + "'" + ",'" + f1lepathlog + "'";
                // OR CMD.CommandText = "CREATE DATABASE " & MYDBNAME & " ON (FILENAME = '" & f1lepath & "')FOR ATTACH"
                CMD.ExecuteNonQuery();
                SqlConnection1.Dispose();
                MessageBox.Show("تم انشاء اتصال  قاعدة البيانات  بالسرفر ", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading);
            }
            catch
            {
                MessageBox.Show("فشل البرنامج فى انشاء اتصال  بقاعدة البيانات  بالسرفر", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading);
            }
        }
 
 
 
نغير هنا فقط إسم قاعدة البيانات بدلا من DatabaseName
 
الان نأتى لحدث Load لنفس النافذه نكتب هذا الكود 



private void Form1_Load(object sender, EventArgs e)
        {
            if (GETATTACHDATABASENAME() == false)
                ATTACHDATABASENAME("DatabaseName", Application.StartupPath + @"\db\DatabaseName.MDF", Application.StartupPath + @"\db\DatabaseName_log.LDF");
        }
 



طبعا هنا كما هو واضح ان قاعدة البيانات موجودة بنفس مسار الملف التنفيذى exe بداخل مجلد db ، نغير ايضا DatabaseName لأسم قاعدة البيانات وايضا بالمسار مع امتداد الملفات الخاصة بقاعدة البيانات

اذا كانت قاعدة البيانات موجود بالسيرفر SSMS قم بعمل Detach لها عن طريق RightClick ثم Tasks ثم Detach .
جرب الان تشغيل البرنامج وتجربة عمل Attach بالكود
تظهر رسالة تفيد بأن قاعدة البيانات عن موجودة بالسيرفر ثم رسالة آخرى تأكد اتصال قاعدة البيانات بالسيرفر وهذه الرسالة تظهر أول مرة فقط عند تشغيل البرنامج على جهاز العميل .

لتجنب أى مشاكل فى تطبيق الدرس يجب تشغيل كمدير راجع هذا الدرس تشغيل البرنامج بصلاحية مدير برمجيا 
يجب ان تكون قاعدة البيانات بنفس اصدار السيرفر المثبت عند جهاز العميل

الاسمبريد إلكترونيرسالة