(08-07-24, 07:14 PM)Taha Okla كتب : [ -> ]كود ضغط واصلاح قاعدة البيانات نفسها :
كود :
SQLiteConnection Conn = new SQLiteConnection("Data Source = B2testdb.db");
Conn.Open();
SQLiteCommand cmd = new SQLiteCommand("VACUUM", Conn);
cmd.ExecuteNonQuery();
Conn.Close();
كود نسخة إحتياطية بحجم حقيقي بعد الضغط والاصلاح(للنسخة الاحتياطية) :
كود :
SQLiteConnection Conn = new SQLiteConnection("Data Source = B2testdb.db");
Conn.Open();
SQLiteCommand cmd = new SQLiteCommand("VACUUM main INTO 'backup.db'", Conn);
cmd.ExecuteNonQuery();
Conn.Close();
ما شاء الله
مشكور اخ طه على الاكواد الجميلة
فضلا هل يمكن مراجعة الكود الخاص بنسخ قاعدة البيانات الى مسار محدد لأنه لم يعمل معي
كود :
Dim Con = New SQLiteConnection("Data Source=|DataDirectory|\codedb.db")
If Con.State = ConnectionState.Closed Then Con.Open()
'Dim backupFileName As String = Application.StartupPath & "codedb" & "_" & System.DateTime.Now.ToString("dd-MM-yyyy_h-mm-ss") & ".db"
Dim backupFileName2 As String = Application.StartupPath & "\backup.db"
Dim cmd = New SQLiteCommand("VACUUM MAIN INTO '" & backupFileName2 & "'", Con)
'Dim cmd = New SQLiteCommand("VACUUM main INTO 'c:\codedb_backup.db'", Con)
cmd.ExecuteNonQuery()
Con.Close()
ربما هذا الأمر ("VACUUM main INTO 'backup.db'") لا يعمل على قواعد البيانات القديمة قبل الاصدار الذي ينزل بـ NuGet إصدار (SQLite Core)
على كل هناك طريقة أخرى تعمل على الاصدارات القديمة وهي :
كود :
Dim Con As New SQLiteConnection("Data Source=|DataDirectory|\testdb.db") ' الكائن الأساسي لقاعدة البيانات الحالية
Dim Con2 As New SQLiteConnection("Data Source= " & Application.StartupPath & "\backup.db") ' كائن النسخة الاحتياطية
' فتح الاتصال
If Con.State <> ConnectionState.Closed Then Con.Close()
Con.Open()
If Con2.State <> ConnectionState.Closed Then Con.Close()
Con2.Open()
' إصلاح قاعدة البيانات الاساسية من أجل ضغطها
Dim cmd As SQLiteCommand = New SQLiteCommand("VACUUM", Con)
' عمل نسخة إحتياطية
Con.BackupDatabase(Con2, "main", "main", -1, Nothing, 0)
Con2.Close()
Con.Close()
(09-07-24, 04:22 PM)Taha Okla كتب : [ -> ]ربما هذا الأمر ("VACUUM main INTO 'backup.db'") لا يعمل على قواعد البيانات القديمة قبل الاصدار الذي ينزل بـ NuGet إصدار (SQLite Core)
على كل هناك طريقة أخرى تعمل على الاصدارات القديمة وهي :
كود :
Dim Con As New SQLiteConnection("Data Source=|DataDirectory|\testdb.db") ' الكائن الأساسي لقاعدة البيانات الحالية
Dim Con2 As New SQLiteConnection("Data Source= " & Application.StartupPath & "\backup.db") ' كائن النسخة الاحتياطية
' فتح الاتصال
If Con.State <> ConnectionState.Closed Then Con.Close()
Con.Open()
If Con2.State <> ConnectionState.Closed Then Con.Close()
Con2.Open()
' إصلاح قاعدة البيانات الاساسية من أجل ضغطها
Dim cmd As SQLiteCommand = New SQLiteCommand("VACUUM", Con)
' عمل نسخة إحتياطية
Con.BackupDatabase(Con2, "main", "main", -1, Nothing, 0)
Con2.Close()
Con.Close()
أشتغل الكود بنجاح
تقييم +1
كنت افكر في طريقة اخرى باستعمال الكود الاول حتى وجدتت مشاركتك
ضغط واصلاح نفس قاعدة البيانات ومن ثمة نسخ القاعدة الى مجلد آخر (Backup) باسم مغاير
بعد عدة محاولات لانشاء أنواع متعددة من الحقول على قاعدة بيانات SQLite
وجدت أنه :
- لا يوجد خصوصية لأي حقل.
- يمكنك تخزين أي نوع من البيانات في أي حقل من الحقول دون أن ينبهك إلى ذلك ودون أن يعطيك أي رسالة خطأ.
- لا يوجد حدود للتخزين، يعني لو ذكرت نريد حقل نصي(40) يمكنك كتابة أي شيء يتجاوز 40 حرف بل المئات..
- يمكنك تخزين قيم نصية في حقول رقمية.
- الأهم من ذلك : يمكنك أثناء كتابة الكود أن تخترع أنواع من عندك للبيانات المخصصة في الحقول...
مثلا بالعادة نكتب حقل من نوع Int أو Text أو VarChar
لكن الان لست مقيداً فهذه أشياء تكتبه بشكل وهمي، ولكن كل الحقول من نوع واحد مهما وضعت من أنواع بيانات
مثلاً فيك تختار نوع شاكو ماكو ..
جرب أن تصنع جدول في قاعدة بيانات من خلال الكود التالي وستجد أنه يتم إنشاء تلك القاعدة وبدون مشاكل.. :
كود :
"CREATE TABLE items (name ShacoMaco(20) , price SingleMingle, in_stock TikTak) "
بصراحة تفاجأت بها .. على الرغم من بساطة العمل عليها.
هل هذه ميزة : أم عشوائية وإهمال؟!!!...
(10-07-24, 07:03 PM)Taha Okla كتب : [ -> ]بعد عدة محاولات لانشاء أنواع متعددة من الحقول على قاعدة بيانات SQLite
وجدت أنه :
- لا يوجد خصوصية لأي حقل.
- يمكنك تخزين أي نوع من البيانات في أي حقل من الحقول دون أن ينبهك إلى ذلك ودون أن يعطيك أي رسالة خطأ.
- لا يوجد حدود للتخزين، يعني لو ذكرت نريد حقل نصي(40) يمكنك كتابة أي شيء يتجاوز 40 حرف بل المئات..
- يمكنك تخزين قيم نصية في حقول رقمية.
- الأهم من ذلك : يمكنك أثناء كتابة الكود أن تخترع أنواع من عندك للبيانات المخصصة في الحقول...
مثلا بالعادة نكتب حقل من نوع Int أو Text أو VarChar
لكن الان لست مقيداً فهذه أشياء تكتبه بشكل وهمي، ولكن كل الحقول من نوع واحد مهما وضعت من أنواع بيانات
مثلاً فيك تختار نوع شاكو ماكو ..
جرب أن تصنع جدول في قاعدة بيانات من خلال الكود التالي وستجد أنه يتم إنشاء تلك القاعدة وبدون مشاكل.. :
كود :
"CREATE TABLE items (name ShacoMaco(20) , price SingleMingle, in_stock TikTak) "
بصراحة تفاجأت بها .. على الرغم من بساطة العمل عليها.
هل هذه ميزة : أم عشوائية وإهمال؟!!!...
صحيح

لا ادري كيف استطعت ان تكتشف ذلك
مما تعلمته عن قواعد البيانات :
أنه العمليات المطبقة على بعض الحقول الرقمية تتجاوز سرعتها عدة مرات عما ينفذ على نظيرتها النصية ..
لذلك أهتم كثيراً بنوع الحقل قبل التنفيذ عليه ..
بساطة العمل على هذه الملفات لفت أنتباهي، وكنت فكر بصرف نظري إلى العمل عليها
مقارنة بآكسس ... فأغلب مشاريعي أعتمد بها على قواعد بيانات آكسس لما توفره مايكروسوفت من مستعرض ملفات إحترافي لها..
وسهولة التعامل معها من خلاال مشغلها الأساسي ، بحيث لو حدث خطأ في إدخال أو العمليات على بعض الحقول أنه بإمكاني من خلال
خصائص مشغل آكسس أن أجد ذاك الخطأ بسرعة وأصلحه. دون الحاجة لأنتظر حتى أصحح برنامجي وأجعل العميل يتأخر ويعطل عمله ...
و عندما أجرب شيء جديد : أحاول أن أجرب عليه كل الحالات التي أحتاجها...
فخلال أولى التجارب ظهرت لي هذه المشكلة...
والله أعلم إن لم يكن هناك ما هو أعظم منها.. ما دام أهم شيء لم يهتموا فيه (أي نوع البيانات المدخلة)..
(12-07-24, 04:14 AM)Taha Okla كتب : [ -> ]مما تعلمته عن قواعد البيانات :
أنه العمليات المطبقة على بعض الحقول الرقمية تتجاوز سرعتها عدة مرات عما ينفذ على نظيرتها النصية ..
لذلك أهتم كثيراً بنوع الحقل قبل التنفيذ عليه ..
بساطة العمل على هذه الملفات لفت أنتباهي، وكنت فكر بصرف نظري إلى العمل عليها
مقارنة بآكسس ... فأغلب مشاريعي أعتمد بها على قواعد بيانات آكسس لما توفره مايكروسوفت من مستعرض ملفات إحترافي لها..
وسهولة التعامل معها من خلاال مشغلها الأساسي ، بحيث لو حدث خطأ في إدخال أو العمليات على بعض الحقول أنه بإمكاني من خلال
خصائص مشغل آكسس أن أجد ذاك الخطأ بسرعة وأصلحه. دون الحاجة لأنتظر حتى أصحح برنامجي وأجعل العميل يتأخر ويعطل عمله ...
و عندما أجرب شيء جديد : أحاول أن أجرب عليه كل الحالات التي أحتاجها...
فخلال أولى التجارب ظهرت لي هذه المشكلة...
والله أعلم إن لم يكن هناك ما هو أعظم منها.. ما دام أهم شيء لم يهتموا فيه (أي نوع البيانات المدخلة)..
في بداية تجاربي مع قواعد بيانات sqlite وجدت حديثا كثيرا في المنتديات الاجنبية عن قابلية هذه القواعد للتلف والعطب
ثم ذهبت اغلب التخمينات ان السبب هو مشاركة القاعدة على الشبكة .لذلك تم الالتفاف على هذه المشكلة بحصر استعمال القاعدة خارج الشبكلات والابتعاد عن المشاركة قدر المستطاع وان كان لا بد فيجب نسخ القاعدة احتياطيا وعلى الدوام
في النسخ القديمة ظهرت ايضا مشكلة التاريخ في نوع الحقل وتم الالتفاف على هذه المشكلة بحفظ التواريخ على شكل نص ثم الدخول في سلسلة التحويلات واعتقد ان هذا حل غير عملي
فلا يعقل اذا كانت قاعدة البيانات كبيرة ان اجبر محرك البحث على ترجمة وتحويل ملايين السجلات من حقل نصي الى رقمي وخصوصا عند استعمال التعليمة between
ثم ظهر نوع الحقل الجديد Datetext لان محاولة الالتفاف على المشكلة زادتها تعقيدا خصوصا اذا علمنا ان بعض البرامج تولي اهمية قصوى للتعليمة format اثناء البحث بالتواريخ
Stored procedure ايضا غير موجود اطلاقا ويجب الاستعانة بالجداول المؤقتة كبديل ( يتم انشاؤها برمجيا ومحوها او تدميرها بعد كل عملية )
لم اجرب هذه الطريقة ولكن اعتقد في حالة التعامل مع قواعد بيانات كبيرة فان هذا سيشكل عبء اضافي على الذاكرة او على الاقل سيؤثر على زمن استرجاع البيانات
رأيي كمبتدىء ان هذه القواعد تصلح للتخزبن الكمي (ملفات .نصوص.صور...الخ) اكثر منه للتخزين الرقمي (على نحو ما هو موجود في القواعد المحاسبية للشركات) والله اعلم
اعتقد انني سأتوجه الى قواعد بيانات فايربيرد Firebird لاجراء بعض المقارنات عليها ايضا

السلام عليكم ورحمة الله وبركاته شكرا جزيلا على ما تقدم
بس نفسي اعرف كود استرداد البيانات من النسخة الاحتياطية وشكرا
مثل كود النسخ هذا
SQLiteConnection Conn = new SQLiteConnection("Data Source = B2testdb.db");
Conn.Open();
SQLiteCommand cmd = new SQLiteCommand("VACUUM main INTO 'backup.db'", Conn);
cmd.ExecuteNonQuery();
Conn.Close();
(19-01-25, 07:06 PM)علي المروعي كتب : [ -> ]السلام عليكم ورحمة الله وبركاته شكرا جزيلا على ما تقدم
بس نفسي اعرف كود استرداد البيانات من النسخة الاحتياطية وشكرا
مثل كود النسخ هذا
SQLiteConnection Conn = new SQLiteConnection("Data Source = B2testdb.db");
Conn.Open();
SQLiteCommand cmd = new SQLiteCommand("VACUUM main INTO 'backup.db'", Conn);
cmd.ExecuteNonQuery();
Conn.Close();
في الحقيقة لا تحتاج الى هذا الكود
تحتاج فقط الى قطع الاتصال ثم نسخ واستبدال قاعدة البيانات بالنسخة الاحتياطية
ثم اعادة ربط الاتصال