السلام عليكم ورحمة الله وبركاته
أحيانا نريد عمل Attach لقاعدة البيانات على جهاز العميل لأول مرة يعمل البرنامج على جهازه
اذا كنت تتعامل فى بيئة التطوير مع EntityFramework فيجب ان تشاهد هذا الدرس عمل Migration عن طريق Database Initializer الجزء الخاص CreateDatabaseIfNotExists
اما اذا كنت تتعامل مع Ado.net طبق معنا هذا الدرس .
داخل مشروعك الذى تتعامل معه بـ Ado مع قاعدة البيانات وفى النافذة الأولى التى تفتح عند تشغيل البرنامج
اكتب هذه Functions
اكتب هذه 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 بالكود
تظهر رسالة تفيد بأن قاعدة البيانات عن موجودة بالسيرفر ثم رسالة آخرى تأكد اتصال قاعدة البيانات بالسيرفر وهذه الرسالة تظهر أول مرة فقط عند تشغيل البرنامج على جهاز العميل .
لتجنب أى مشاكل فى تطبيق الدرس يجب تشغيل كمدير راجع هذا الدرس تشغيل البرنامج بصلاحية مدير برمجيا
يجب ان تكون قاعدة البيانات بنفس اصدار السيرفر المثبت عند جهاز العميل
تعليقات
إرسال تعليق