تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] عمل اتتاتش للداتا بيز عند فتح البرنامج اول مرة عل جهاز العميل
#1
السلام عليكم ورحمة الله وبركاته

لاحظت اخوانى ان بعض بعض الاعضاء يسئل عن عمل اتتاتش للداتا بيز اما عن طريق التحزيم او بطرق اخرى لكن حبيت اكتب طريقة اعمل بها من سنوات
وهى طريقة مناسبة جدا لانها لا تجعل العميل يقوم باى خطوات لعمل اتتاتش ولا يفعل اى شيئ غير انه يفتح البرنامج

اولا : يجب ارفاق الداتا بيز بمسار المشروع ويفضل ان تكون بمجلد منفصل للترتيب فقط
مثلا المجلد باسم 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 والسبب هو ان كانت الداتا بيز متصلة لا يقوم بتنفيذ الكود اما ان لم تكن متصلة يقوم بالتنفيذ
: يجب كتابة الكود الخاص باللود فروم اعلى الحدث قبل اى اكواد اخرى خاصة بالداتا بيز او الاستعلامات الاخرى لتجنب اى اكسبشن فى الرن تايم

فى النهاية اسئلكم الدعاء بظهر الغيب
تحياتى لكم جميعا
الرد }}}
#2
السّلام عليكم و رحمة الله و بركاته
أستاذنا الفاضل " mero5000 "
بارك الله فيك و لك و جزاك خير الجزاء و أحسن إليك مثلما أحسنت إلينا بهذا الدّرس الرّائع و المميّز و الممتاز و المفيد
تحياتي و تقييماتي
قناتنا على اليوتوب
الرد }}}
تم الشكر بواسطة: محمد اسماعيل , Abou Eman , mero5000 , baha
#3
وعليكم السلام ورحمة الله وبركاته

جزاك الله خيرا وبارك فيك أخي الكريم

لقد طبقت الشرح كاملا مثل ما تفضلت به

وقمت بتعديل واحد فقط وهو 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
لا إله إلا الله وحده لا شريك له له الملك وله الحمد وهو على كل شئ قدير
سبحان الله وبحمده سبحان الله العظيم
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلى العظيم
رب أغفر لي 

الرد }}}
تم الشكر بواسطة: mero5000 , mero5000
#4
اضافة جميلة اخى 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

يمكنك فعل ذلك على الملفات لديك بجهازك قبل وضعها فى السورس البرنامج
حتى اذا تغيير من جهاز لاخر سيكون مطبع على جميع اسماء المستخدمين

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد }}}
تم الشكر بواسطة: princelovelorn , mero5000 , baha , baha
#5
(01-09-18, 03:50 PM)elgokr كتب :
مرحباً اخى الفاضل princelovelorn

لحل المشكلة تعال على ملفات قاعدة البيانات وطبق مثل الفيديو التالى

لكن لا تقوم بكتابة اسم المستخدم كما هو ذكر فى الفيديو
الاسم الصح لذلك هو EVERYONE وعند الكتابة يمكنك فقط كتابة eve والضغط على Check Name

يمكنك فعل ذلك على الملفات لديك بجهازك قبل وضعها فى السورس البرنامج
حتى اذا تغيير من جهاز لاخر سيكون مطبع على جميع اسماء المستخدمين

تحياتى لك
وتمنياتى لك التوفيق





أستاذي الفاضل elgokr

جزاك الله خيرا وبارك فيك وزادك علمك ونفع بك الأسلام والمسلمين



لا إله إلا الله وحده لا شريك له له الملك وله الحمد وهو على كل شئ قدير
سبحان الله وبحمده سبحان الله العظيم
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلى العظيم
رب أغفر لي 

الرد }}}
تم الشكر بواسطة: elgokr , elgokr , mero5000 , baha
#6
(01-09-18, 05:42 PM)princelovelorn كتب :
(01-09-18, 03:50 PM)elgokr كتب :
مرحباً اخى الفاضل princelovelorn

لحل المشكلة تعال على ملفات قاعدة البيانات وطبق مثل الفيديو التالى

لكن لا تقوم بكتابة اسم المستخدم كما هو ذكر فى الفيديو
الاسم الصح لذلك هو EVERYONE وعند الكتابة يمكنك فقط كتابة eve والضغط على Check Name

يمكنك فعل ذلك على الملفات لديك بجهازك قبل وضعها فى السورس البرنامج
حتى اذا تغيير من جهاز لاخر سيكون مطبع على جميع اسماء المستخدمين

تحياتى لك
وتمنياتى لك التوفيق





أستاذي الفاضل elgokr
جزاك الله خيرا وبارك فيك وزادك علمك ونفع بك الأسلام والمسلمين



الحمد لله والشكر لله

تقبل الله منك الدعاء لى ولك وللجميع ان شاء الله

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد }}}
تم الشكر بواسطة: princelovelorn , mero5000
#7
عبد العزيز البسكري وبارك فيك ولك يا اخى

princelovelorn الاخ الجوكر قام بالواجب انا للاسف لم ادخل من امس للمنتدى
لا تنسى تشغيل برنامج البرنامج كمسئول ليكون له صلاحية المدير فى التعامل مع السيرفر هيحل كل مشاكلك

الجوكر بارك الله فيك دائما سباق للمساعدة
الرد }}}
تم الشكر بواسطة: elgokr , princelovelorn , princelovelorn
#8
لا عليك اخى mero5000
فكلنا هنا اخوة ولكنا هنا يد واحدة فى المساعدة

فبارك الله لك فى طرحك هذا الموضوع الجميع

فكل التحية لك
وتمنياتى لك التوفيق الدائم
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد }}}
تم الشكر بواسطة: mero5000 , princelovelorn , kebboud , baha , baha
#9
(01-09-18, 07:48 PM)mero5000 كتب : عبد العزيز البسكري وبارك فيك ولك يا اخى

princelovelorn الاخ الجوكر قام بالواجب انا للاسف لم ادخل من امس للمنتدى
لا تنسى تشغيل برنامج البرنامج كمسئول ليكون له صلاحية المدير فى التعامل مع السيرفر هيحل كل مشاكلك

الجوكر بارك الله فيك دائما سباق للمساعدة

جزاك الله خيراً أخي وبارك فيك وزادك علماً
والحمد لله لقد أستفدت كثيراً جداً من درسك 


وبارك الله في الأخ الجوكر وزاده علماً
لا إله إلا الله وحده لا شريك له له الملك وله الحمد وهو على كل شئ قدير
سبحان الله وبحمده سبحان الله العظيم
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلى العظيم
رب أغفر لي 

الرد }}}
تم الشكر بواسطة: mero5000 , mero5000 , elgokr
#10
(02-09-18, 12:23 PM)princelovelorn كتب : جزاك الله خيراً أخي وبارك فيك وزادك علماً
والحمد لله لقد أستفدت كثيراً جداً من درسك 


وبارك الله في الأخ الجوكر وزاده علماً


اللهم امين ولما جميعاً يارب


تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مثال] طريقة إنشاء قاعدة sql بواسطة script برمجيا وكتابة أسمها بواسطة العميل princelovelorn 9 8,080 26-03-23, 04:24 PM
آخر رد: sanyor77
  [مقال] مشاركة البرنامج على أكثر من جهاز (قاعدة بيانات اكسيس) mr_hso 0 541 06-01-23, 05:21 AM
آخر رد: mr_hso

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم