27-11-19, 05:28 AM
(26-11-19, 02:49 PM)asemshahen5 كتب : لعمل اتاش استخدم اسم قاعدة البيانات في نص الاتصال ماستر اي يوجد نص اتصال خاص بعمل الاتاش ليس له علاقة بنص الاتصال الخاص بقاعدة بيانات البرنامج .
هذا الكود مشروح :
PHP كود :
''' <summary>
''' عمل اتاش لقاعدة البيانات
''' </summary>
''' <param name="MYDBNAME">اسم قاعدة البيانات</param>
''' <param name="f1lepathprimary">مكان و اسم ملف mdf</param>
''' <param name="f1lepathlog">مكان و اسم الملف log</param>
''' <returns>العودة بقيمة True في حال النجاح و قيمة False في حال الفشل</returns>
''' <remarks>شركة العاصم للبرمجيات https://asemshahen5.blogspot.com/ </remarks>
Public Function AttachDatabaseName(MYDBNAME As String, f1lepathprimary As String, f1lepathlog As String) As Boolean
Try
'كود الاتصال الخاص بعملية الاتاش'
Dim SqlConnection1 As New SqlClient.SqlConnection("Data Source=(Local)\sqlexpress " &
";Initial Catalog=tempdb;Integrated Security=SSPI;")
'تعريف سيكول كوماند'
Dim CMD As New SqlClient.SqlCommand()
'نوع الكوماند تيكست اي استعلام'
CMD.CommandType = CommandType.Text
'تحديد كود الاتصال بنص الاتصال الذي في الاعلى'
CMD.Connection = SqlConnection1
If SqlConnection1.State = ConnectionState.Closed Then SqlConnection1.Open()
'الاستعلام الخاص بعمل الاتاش'
CMD.CommandText = "sp_attach_db " & MYDBNAME & ",'" & f1lepathprimary & "'" & ",'" & f1lepathlog & "'"
'الاستعلام الخاص بعمل الاتاش'
'' OR CMD.CommandText = "CREATE DATABASE " + MYDBNAME + " ON (FILENAME = '" & f1lepath & "')FOR ATTACH"
'تنفيذ الاستعلام'
CMD.ExecuteNonQuery()
'اغلاق الاتصال'
SqlConnection1.Close()
SqlConnection1.Dispose()
'رسالة تخبر بنجاح عملية الاتاش'
MessageBox.Show("تم انشاء اتصال قاعدة البيانات بالسرفر ", "Attach Database",
MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2,
MessageBoxOptions.RtlReading)
'العودة بقيمة True'
Return True
Catch ex As Exception
'رسالة تفيد بفشل عملية الاتاش و سبب الخطء'
MessageBox.Show(ex.Message & vbNewLine & "فشل البرنامج فى انشاء اتصال بقاعدة البيانات بالسرفر",
"Attach Database", MessageBoxButtons.OK, MessageBoxIcon.Information,
MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading)
'العودة بقيمة False'
Return False
End Try
End Function
شرح كود الاستدعاء الخاص بالزر :
PHP كود :
'كود الاستدعاء الخاص بعملية الاتاش في زر'
Private Sub BtnAttachDatabase_Click(sender As Object, e As EventArgs) Handles BtnAttachDatabase.Click
'تعريف متغير صندوق حوار فتح'
Dim openfd As New OpenFileDialog
'الفلتر على نوع قاعدة البيانات mdf'
openfd.Filter = "Sql Server Database(*.mdf)|*.mdf"
'عنوان صندوق الحوار فتح'
openfd.Title = "Attach Database"
'التاكد من اختيار موافق لتلافي حصول خطا'
If openfd.ShowDialog = DialogResult.OK Then
'التاكد من عدم وجود قاعدة البيانات'
If (Cls.GetAttachDatabaseName(Txt_DBName.Text) = False) Then
'تعريف متغير نصي فيه اسم قاعدة البيانات'
Dim SafeFileName As String = openfd.SafeFileName
'حذف لاحقة اسم قاعدة البيانات'
SafeFileName = SafeFileName.Replace(".mdf", "")
'تعريف متغير نصي فيه اسم و عنوان قاعدة البيانات'
Dim DBName As String = openfd.FileName
'استبدال لاحقة mdf من اسم و عنوان قاعدة البيانات بلاحقة log'
DBName = DBName.Replace(".mdf", "_log.ldf")
'وضع اسم ومسار ملف اللوغ في ليبل'
Lbl_DBPath_LDF.Text = DBName
'وضع اسم و ملف الـ mdf في ليبل اخر'
Lbl_DBPath_MDF.Text = openfd.FileName
'رسالة تاكد من عمل الاتاش'
If MessageBox.Show("Are You Sure Attach Database File : " & openfd.FileName, "Attach Database", MessageBoxButtons.YesNo) = DialogResult.Yes Then
'عمل شرط في حال نجاح عملية الاتاش'
If (Cls.AttachDatabaseName(SafeFileName, openfd.FileName, DBName) = True) Then
'اعادة تعبئة الداتاغريدفيو باسماء قواعد البيانات'
dataGridView1.DataSource = Cls.FindDatabaseByName(Txt_DBName.Text)
Else
'اعادة تعبئة الداتاغريدفيو باسماء قواعد البيانات'
dataGridView1.DataSource = Cls.FindDatabaseByName(Txt_DBName.Text)
End If
End If
End If
End If
End Sub
شرح كود البحث عن قاعدة البيانات في السرفير :
PHP كود :
''' <summary>
''' كود التاكد من وجود قاعدة البيانات في السيرفير
''' </summary>
''' <param name="YourDbName">اسم قاعدة البيانات</param>
''' <returns>الفودة في قيمة True في حال وجد قاعدة البيانات اي لا يجب عمل اتاش او العكس</returns>
''' <remarks>شركة العاصم للبرمجيات https://asemshahen5.blogspot.com/ </remarks>
Public Function GetAttachDatabaseName(YourDbName As String) As Boolean
'تعريف داتا تيبل'
Dim DT As New DataTable
'كود نص الاتصال الخاص بالبحث في اسماء قواعد البيانات'
Dim SqlConnection1 As New SqlClient.SqlConnection("Data Source=(Local)\sqlexpress" &
";Initial Catalog=tempdb;Integrated Security=SSPI;")
'استعلام خاص بالبحث عن اسم قاعدة البيانات في السيرفير'
Dim Str As String = "Select DISTINCT name from master.dbo.sysdatabases where name Like '" & YourDbName &
"' and has_dbaccess(Name) = 1 "
'تعريف داتا ادبتر مع وضع كود الاستعلام و الاتصال'
Dim ADP As New SqlClient.SqlDataAdapter(Str, SqlConnection1)
'تفريغ الداتا تيبل'
DT.Clear()
'تعبئة الداتا تيبل من نتيجة الاستعلام'
ADP.Fill(DT)
'تعريف متغير يحمل نتيجة الاستعلام'
Dim i As Integer = DT.Rows.Count
'في حال كان المتغير 0 يعني قاعدة البيانات غير متصلة'
If i = 0 Then
MessageBox.Show(" قاعدة البيانات 'قاعدة بيانات البرنامج'" +
"غير متصلة بالسرفر جارى عمل الاتصال", Environment.MachineName,
MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,
MessageBoxOptions.RtlReading)
'العودة بقيمة False في حال عدم وجود لاسم قاعدة البيانات في السيرفير
Return False
Else
'العودة بقيمة True في حال اتصال قاعدة البيانات في السيرفير'
Return True
End If
End Function
اخي انا اريد عند فتح البرنامج لاول مره..
يقوم البرنامج بعمل attach لقاعدة البيانات تلقائيا و الاتصال بها..
