عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - mero5000 - 31-08-18
السلام عليكم ورحمة الله وبركاته
لاحظت اخوانى ان بعض بعض الاعضاء يسئل عن عمل اتتاتش للداتا بيز اما عن طريق التحزيم او بطرق اخرى لكن حبيت اكتب طريقة اعمل بها من سنوات
وهى طريقة مناسبة جدا لانها لا تجعل العميل يقوم باى خطوات لعمل اتتاتش ولا يفعل اى شيئ غير انه يفتح البرنامج
اولا : يجب ارفاق الداتا بيز بمسار المشروع ويفضل ان تكون بمجلد منفصل للترتيب فقط
مثلا المجلد باسم db بجانب الملف التنفيذى
ثانيا : سوف نضيف بالفروم الذى يفتح اولا وليكن فروم login نضيف 2 فانكشن
كود :
Public Shared Function GETATTACHDATABASENAME() As Boolean
On Error Resume Next
Dim DS As New DataSet
Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\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 SqlClient.SqlDataAdapter
ADP = New SqlClient.SqlDataAdapter(str, SqlConnection1)
DS.Clear()
ADP.Fill(DS)
Dim i As Integer
If DS.Tables(0).Rows.Count = 0 Then
GETATTACHDATABASENAME = False
MessageBox.Show(" قاعدة البيانات 'قاعدة بيانات البرنامج'" & "غير متصلة بالسرفر جارى عمل الاتصال", My.Computer.Name, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading)
Else
GETATTACHDATABASENAME = True
End If
ADP.Dispose()
SqlConnection1.Dispose()
End Function
نلاحظ ان المتغير str به اسم قاعدة بياناتك ....
كود :
where name Like 'YourDbName'
نقوم فقط بتغيره لاسم الداتا بيز الخاصة بك كما هو داخل ''
ثم نقوم بإضافة الميثود التالى
كود :
Public Shared Sub ATTACHDATABASENAME(ByVal MYDBNAME As String, ByVal f1lepathprimary As String, ByVal f1lepathlog As String)
Try
Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLEXPRESS" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
Dim CMD As SqlClient.SqlCommand = New SqlClient.SqlCommand
CMD.CommandType = CommandType.Text
CMD.Connection = SqlConnection1
If SqlConnection1.State = ConnectionState.Open Then 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 ex As Exception
Dim result As Integer
result = MessageBox.Show("فشل البرنامج فى انشاء اتصال بقاعدة البيانات بالسرفر", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading)
End Try
End Sub
ولا نغير بها اى شيئ التغير الوحيد فقط فى اسم الداتا بيز بالفنكشن الاولى..
هذه الاكواد هى المسئولة عن عمل اتتاتش للداتا بيز
لاستخدام هذه الاكواد فقط نكتب هذا الكود فى حدث اللود فروم للفروم الى بيفتح اولا كما قلنا سابقا
كود :
If GETATTACHDATABASENAME() = False Then
ATTACHDATABASENAME("database", Application.StartupPath & "\db\database.MDF", Application.StartupPath & "\db\database_log.LDF")
End If
فرضا اسم قاعدة البيانات database
يكون اسمها بين علامات "" فى الاول
ثم بمسار البرنامج نكتب اسمها بالمسار + الامنتداد
ثم نكتب اسم ملف اللوج بالامنتداد كما هو موضح سابقا فى الكود
الان نقوم بعمل تجربة وقاعدة البيانات غير مشبوكة بالسيرفر
ستظهر رسالة تقول لك ان الداتا بيز غير متصلة بالسيرفر من الفنكشن الاولى بعد الظغط على اوك سنجد ان الداتا بيز تم شبكها بالسيرفر
ويمكن التأكد من ssms
ملحوظة : نلاحظ ان الفنكشن من نوع Boolean والسبب هو ان كانت الداتا بيز متصلة لا يقوم بتنفيذ الكود اما ان لم تكن متصلة يقوم بالتنفيذ
: يجب كتابة الكود الخاص باللود فروم اعلى الحدث قبل اى اكواد اخرى خاصة بالداتا بيز او الاستعلامات الاخرى لتجنب اى اكسبشن فى الرن تايم
فى النهاية اسئلكم الدعاء بظهر الغيب
تحياتى لكم جميعا
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - عبد العزيز البسكري - 31-08-18
السّلام عليكم و رحمة الله و بركاته
أستاذنا الفاضل " mero5000 "
بارك الله فيك و لك و جزاك خير الجزاء و أحسن إليك مثلما أحسنت إلينا بهذا الدّرس الرّائع و المميّز و الممتاز و المفيد
تحياتي و تقييماتي
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - princelovelorn - 01-09-18
وعليكم السلام ورحمة الله وبركاته
جزاك الله خيرا وبارك فيك أخي الكريم
لقد طبقت الشرح كاملا مثل ما تفضلت به
وقمت بتعديل واحد فقط وهو sqlexpress الى sqlnext لان هدا اسم السيرفر لدي
وهذا طبعا مؤقتا لحين التعديل عليه لاحقا
وهذا هو الكود كاملا
كود :
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If GETATTACHDATABASENAME() = False Then
ATTACHDATABASENAME("database99", Application.StartupPath & "\db\database99.MDF", Application.StartupPath & "\db\database99_log.LDF")
End If
End Sub
Public Shared Function GETATTACHDATABASENAME() As Boolean
On Error Resume Next
Dim DS As New DataSet
Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLnext" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
Dim str As String = "Select DISTINCT name from master.dbo.sysdatabases where name Like 'database99' and has_dbaccess(Name) = 1 "
Dim ADP As SqlClient.SqlDataAdapter
ADP = New SqlClient.SqlDataAdapter(str, SqlConnection1)
DS.Clear()
ADP.Fill(DS)
Dim i As Integer
If DS.Tables(0).Rows.Count = 0 Then
GETATTACHDATABASENAME = False
MessageBox.Show(" قاعدة البيانات 'قاعدة بيانات البرنامج'" & "غير متصلة بالسرفر جارى عمل الاتصال", My.Computer.Name, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading)
Else
GETATTACHDATABASENAME = True
End If
ADP.Dispose()
SqlConnection1.Dispose()
End Function
Public Shared Sub ATTACHDATABASENAME(ByVal MYDBNAME As String, ByVal f1lepathprimary As String, ByVal f1lepathlog As String)
Try
Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLnext" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
Dim CMD As SqlClient.SqlCommand = New SqlClient.SqlCommand
CMD.CommandType = CommandType.Text
CMD.Connection = SqlConnection1
If SqlConnection1.State = ConnectionState.Open Then 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 ex As Exception
Dim result As Integer
result = MessageBox.Show("فشل البرنامج فى انشاء اتصال بقاعدة البيانات بالسرفر", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading)
MessageBox.Show(ex.Message)
End Try
End Sub
End Class
والنتيجة رسالة خطأ التالية عند محاولة التشغيل من درايف ال c
وهذة عندما حاولت التشغيل من خلال داريف أخر
ملاحظات
قاعدة البيانات فارغة ليس بها اي جدول
تم إنشائها من نفس السيرفر
نسخة ال sql لدي هي sqlserver2008 r2
نسخة الفيجوال vb.net 2010
نسخة الويندوز windows 10 64 bit
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - elgokr - 01-09-18
اضافة جميلة اخى mero5000
وستعم الفائدة على الكثير باذن الله
فكل التحية لك
وتمنياتى لك التوفيق
(01-09-18, 12:43 AM)princelovelorn كتب : وعليكم السلام ورحمة الله وبركاته
جزاك الله خيرا وبارك فيك أخي الكريم
لقد طبقت الشرح كاملا مثل ما تفضلت به
وقمت بتعديل واحد فقط وهو sqlexpress الى sqlnext لان هدا اسم السيرفر لدي
وهذا طبعا مؤقتا لحين التعديل عليه لاحقا
وهذا هو الكود كاملا
كود :
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If GETATTACHDATABASENAME() = False Then
ATTACHDATABASENAME("database99", Application.StartupPath & "\db\database99.MDF", Application.StartupPath & "\db\database99_log.LDF")
End If
End Sub
Public Shared Function GETATTACHDATABASENAME() As Boolean
On Error Resume Next
Dim DS As New DataSet
Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLnext" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
Dim str As String = "Select DISTINCT name from master.dbo.sysdatabases where name Like 'database99' and has_dbaccess(Name) = 1 "
Dim ADP As SqlClient.SqlDataAdapter
ADP = New SqlClient.SqlDataAdapter(str, SqlConnection1)
DS.Clear()
ADP.Fill(DS)
Dim i As Integer
If DS.Tables(0).Rows.Count = 0 Then
GETATTACHDATABASENAME = False
MessageBox.Show(" قاعدة البيانات 'قاعدة بيانات البرنامج'" & "غير متصلة بالسرفر جارى عمل الاتصال", My.Computer.Name, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading)
Else
GETATTACHDATABASENAME = True
End If
ADP.Dispose()
SqlConnection1.Dispose()
End Function
Public Shared Sub ATTACHDATABASENAME(ByVal MYDBNAME As String, ByVal f1lepathprimary As String, ByVal f1lepathlog As String)
Try
Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLnext" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
Dim CMD As SqlClient.SqlCommand = New SqlClient.SqlCommand
CMD.CommandType = CommandType.Text
CMD.Connection = SqlConnection1
If SqlConnection1.State = ConnectionState.Open Then 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 ex As Exception
Dim result As Integer
result = MessageBox.Show("فشل البرنامج فى انشاء اتصال بقاعدة البيانات بالسرفر", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading)
MessageBox.Show(ex.Message)
End Try
End Sub
End Class
والنتيجة رسالة خطأ التالية عند محاولة التشغيل من درايف ال c
وهذة عندما حاولت التشغيل من خلال داريف أخر
ملاحظات
قاعدة البيانات فارغة ليس بها اي جدول
تم إنشائها من نفس السيرفر
نسخة ال sql لدي هي sqlserver2008 r2
نسخة الفيجوال vb.net 2010
نسخة الويندوز windows 10 64 bit
مرحباً اخى الفاضل princelovelorn
لحل المشكلة تعال على ملفات قاعدة البيانات وطبق مثل الفيديو التالى
لكن لا تقوم بكتابة اسم المستخدم كما هو ذكر فى الفيديو
الاسم الصح لذلك هو EVERYONE وعند الكتابة يمكنك فقط كتابة eve والضغط على Check Name
يمكنك فعل ذلك على الملفات لديك بجهازك قبل وضعها فى السورس البرنامج
حتى اذا تغيير من جهاز لاخر سيكون مطبع على جميع اسماء المستخدمين
تحياتى لك
وتمنياتى لك التوفيق
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - princelovelorn - 01-09-18
(01-09-18, 03:50 PM)elgokr كتب : مرحباً اخى الفاضل princelovelorn
لحل المشكلة تعال على ملفات قاعدة البيانات وطبق مثل الفيديو التالى
لكن لا تقوم بكتابة اسم المستخدم كما هو ذكر فى الفيديو
الاسم الصح لذلك هو EVERYONE وعند الكتابة يمكنك فقط كتابة eve والضغط على Check Name
يمكنك فعل ذلك على الملفات لديك بجهازك قبل وضعها فى السورس البرنامج
حتى اذا تغيير من جهاز لاخر سيكون مطبع على جميع اسماء المستخدمين
تحياتى لك
وتمنياتى لك التوفيق
أستاذي الفاضل elgokr
جزاك الله خيرا وبارك فيك وزادك علمك ونفع بك الأسلام والمسلمين
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - elgokr - 01-09-18
(01-09-18, 05:42 PM)princelovelorn كتب : (01-09-18, 03:50 PM)elgokr كتب : مرحباً اخى الفاضل princelovelorn
لحل المشكلة تعال على ملفات قاعدة البيانات وطبق مثل الفيديو التالى
لكن لا تقوم بكتابة اسم المستخدم كما هو ذكر فى الفيديو
الاسم الصح لذلك هو EVERYONE وعند الكتابة يمكنك فقط كتابة eve والضغط على Check Name
يمكنك فعل ذلك على الملفات لديك بجهازك قبل وضعها فى السورس البرنامج
حتى اذا تغيير من جهاز لاخر سيكون مطبع على جميع اسماء المستخدمين
تحياتى لك
وتمنياتى لك التوفيق
أستاذي الفاضل elgokr
جزاك الله خيرا وبارك فيك وزادك علمك ونفع بك الأسلام والمسلمين
الحمد لله والشكر لله
تقبل الله منك الدعاء لى ولك وللجميع ان شاء الله
تحياتى لك
وتمنياتى لك التوفيق
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - mero5000 - 01-09-18
عبد العزيز البسكري وبارك فيك ولك يا اخى
princelovelorn الاخ الجوكر قام بالواجب انا للاسف لم ادخل من امس للمنتدى
لا تنسى تشغيل برنامج البرنامج كمسئول ليكون له صلاحية المدير فى التعامل مع السيرفر هيحل كل مشاكلك
الجوكر بارك الله فيك دائما سباق للمساعدة
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - elgokr - 02-09-18
لا عليك اخى mero5000
فكلنا هنا اخوة ولكنا هنا يد واحدة فى المساعدة
فبارك الله لك فى طرحك هذا الموضوع الجميع
فكل التحية لك
وتمنياتى لك التوفيق الدائم
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - princelovelorn - 02-09-18
(01-09-18, 07:48 PM)mero5000 كتب : عبد العزيز البسكري وبارك فيك ولك يا اخى
princelovelorn الاخ الجوكر قام بالواجب انا للاسف لم ادخل من امس للمنتدى
لا تنسى تشغيل برنامج البرنامج كمسئول ليكون له صلاحية المدير فى التعامل مع السيرفر هيحل كل مشاكلك
الجوكر بارك الله فيك دائما سباق للمساعدة
جزاك الله خيراً أخي وبارك فيك وزادك علماً
والحمد لله لقد أستفدت كثيراً جداً من درسك
وبارك الله في الأخ الجوكر وزاده علماً
RE: عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل - elgokr - 02-09-18
(02-09-18, 12:23 PM)princelovelorn كتب : جزاك الله خيراً أخي وبارك فيك وزادك علماً
والحمد لله لقد أستفدت كثيراً جداً من درسك
وبارك الله في الأخ الجوكر وزاده علماً
اللهم امين ولما جميعاً يارب
تحياتى لك
وتمنياتى لك التوفيق
|